annotate foosdk/sdk/foobar2000/SDK/packet_decoder.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "event_logger.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "audio_chunk.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //! Provides interface to decode various audio data types to PCM. Use packet_decoder_factory_t template to register.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 class NOVTABLE packet_decoder : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! Prototype of function that must be implemented by packet_decoder implementation but is not accessible through packet_decoder interface itself.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 //! Determines whether specific packet_decoder implementation supports specified decoder setup data.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 static bool g_is_our_setup(const GUID& p_owner, t_size p_param1, const void* p_param2, t_size p_param2size) { (void)p_owner; (void)p_param1; (void)p_param2; (void)p_param2size; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 //! Prototype of function that must be implemented by packet_decoder implementation but is not accessible through packet_decoder interface itself.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 //! Initializes packet decoder instance with specified decoder setup data. This is called only once, before any other methods.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 //! @param p_decode If set to true, decode() and reset_after_seek() calls can be expected later. If set to false, those methods will not be called on this packet_decoder instance - for an example when caller is only retrieving information about the file rather than preparing to decode it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 void open(const GUID& p_owner, bool p_decode, t_size p_param1, const void* p_param2, t_size p_param2size, abort_callback& p_abort) { (void)p_owner; (void)p_decode; (void)p_param1; (void)p_param2; (void)p_param2size; (void)p_abort; throw exception_io_data(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 //! Prototype of function that must be implemented by packet_decoder implementation but is not accessible through packet_decoder interface itself.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 //! Returns true if this is not the preferred decoder for this format, another one should be used if found.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 static bool g_is_supported_partially(const GUID& p_owner, t_size p_param1, const void* p_param2, t_size p_param2size) { (void)p_owner; (void)p_param1; (void)p_param2; (void)p_param2size; return false; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! Forwards additional information about stream being decoded. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 //! Calling: this must be called immediately after packet_decoder object is created, before any other methods are called.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //! Implementation: this is called after open() (which is called by implementation framework immediately after creation), and before any other methods are called.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 virtual t_size set_stream_property(const GUID & p_type,t_size p_param1,const void * p_param2,t_size p_param2size) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 //! Retrieves additional user-readable tech infos that decoder can provide.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //! @param p_info Interface receiving information about the stream being decoded. Note that it already contains partial info about the file; existing info should not be erased, decoder-provided info should be merged with it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 virtual void get_info(file_info & p_info) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 //! Returns many frames back to start decoding when seeking.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 virtual unsigned get_max_frame_dependency()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! Returns much time back to start decoding when seeking (for containers where going back by specified number of frames is not trivial).
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 virtual double get_max_frame_dependency_time()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 //! Flushes decoder after seeking.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 virtual void reset_after_seek()=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 //! Decodes a block of audio data.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 //! It may return empty chunk even when successful (caused by encoder+decoder delay for an example), caller must check for it and handle it appropriately.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 //! Called with 0 bytes at the end of stream - if the decoder introduces a delay between input/output, any buffered data should be passed back then.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 virtual void decode(const void * p_buffer,t_size p_bytes,audio_chunk & p_chunk,abort_callback & p_abort)=0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 //! Returns whether this packet decoder supports analyze_first_frame() function.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 virtual bool analyze_first_frame_supported() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 //! Optional. Some codecs need to analyze first frame of the stream to return additional info about the stream, such as encoding setup. This can be only called immediately after instantiation (and set_stream_property() if present), before any actual decoding or get_info(). Caller can determine whether this method is supported or not by calling analyze_first_frame_supported(), to avoid reading first frame when decoder won't utiilize the extra info for an example. If particular decoder can't utilize first frame info in any way (and analyze_first_frame_supported() returns false), this function should do nothing and succeed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 virtual void analyze_first_frame(const void * p_buffer,t_size p_bytes,abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 //! Static helper, creates a packet_decoder instance and initializes it with specific decoder setup data.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 static void g_open(service_ptr_t<packet_decoder> & p_out,bool p_decode,const GUID & p_owner,t_size p_param1,const void * p_param2,t_size p_param2size,abort_callback & p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 static const GUID owner_MP4,owner_matroska,owner_MP3,owner_MP2,owner_MP1,owner_MP4_ALAC,owner_ADTS,owner_ADIF, owner_Ogg, owner_MP4_AMR, owner_MP4_AMR_WB, owner_MP4_AC3, owner_MP4_EAC3, owner_MP4_FLAC, owner_MP4_Opus, owner_MP4_MPEGH;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 struct matroska_setup
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 const char * codec_id;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 uint32_t sample_rate,sample_rate_output;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 uint32_t channels;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 size_t codec_private_size;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 const void * codec_private;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 //owner_MP4: param1 - codec ID (MP4 audio type), param2 - MP4 codec initialization data
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 //owner_MP3: raw MP3/MP2 file, parameters ignored
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 //owner_matroska: param2 = matroska_setup struct, param2size size must be equal to sizeof(matroska_setup)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 //these are used to initialize PCM decoder
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 static const GUID property_samplerate,property_bitspersample,property_channels,property_byteorder,property_signed,property_channelmask, property_bufferpadding, property_eventlogger, property_checkingintegrity, property_samples_per_frame;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 //property_samplerate : param1 == sample rate in hz
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 //property_bitspersample : param1 == bits per sample
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 //property_channels : param1 == channel count
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 //property_byteorder : if (param1) little_endian; else big_endian;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 //property_signed : if (param1) signed; else unsigned;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //propery_bufferpadding : param1 == padding of each passed buffer in bytes; retval: decoder's preferred padding
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 //property_eventlogger : param2 = event logger ptr, NULL to disable, param2size 0 always
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 //property_checkingintegrity : param1 = checking integrity bool flag
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 //property_samples_per_frame : param1 = samples per frame
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 //property_ogg_header : p_param1 = unused, p_param2 = ogg_packet structure, retval: 0 when more headers are wanted, 1 when done parsing headers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 //property_ogg_query_sample_rate : returns sample rate, no parameters
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 //property_ogg_packet : p_param1 = unused, p_param2 = ogg_packet strucute
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 //property_ogg_qury_preskip : returns preskip samples (Opus)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 static const GUID property_ogg_header, property_ogg_query_sample_rate, property_ogg_packet, property_ogg_query_preskip;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 //property_mp4_esds : p_param2 = MP4 ESDS chunk content as needed by some decoders
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 static const GUID property_mp4_esds;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 // DEPRECATED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 static const GUID property_allow_delayed_output;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 // property_mp3_delayless : return non-zero if this codec drops MP3 delay by itself
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 static const GUID property_mp3_delayless;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 // property_query_delay_samples :
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 // Return non-zero if this codec has a decoder delay that the caller should deal with.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 // Param1 signals sample rate used by input - should always match decoder's sample rate - return zero if it does not match.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 static const GUID property_query_delay_samples;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 size_t initPadding();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 void setEventLogger(event_logger::ptr logger);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 void setCheckingIntegrity(bool checkingIntegrity);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 void setAllowDelayed( bool bAllow = true );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 FB2K_MAKE_SERVICE_INTERFACE(packet_decoder,service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 class NOVTABLE packet_decoder_streamparse : public packet_decoder
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 virtual void decode_ex(const void * p_buffer,t_size p_bytes,t_size & p_bytes_processed,audio_chunk & p_chunk,abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 virtual void analyze_first_frame_ex(const void * p_buffer,t_size p_bytes,t_size & p_bytes_processed,abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 FB2K_MAKE_SERVICE_INTERFACE(packet_decoder_streamparse,packet_decoder);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 class NOVTABLE packet_decoder_entry : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(packet_decoder_entry);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 virtual bool is_our_setup(const GUID & p_owner,t_size p_param1,const void * p_param2,t_size p_param2size) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 virtual void open(service_ptr_t<packet_decoder> & p_out,bool p_decode,const GUID & p_owner,t_size p_param1,const void * p_param2,t_size p_param2size,abort_callback & p_abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 //! Returns true if this is not the preferred decoder for this format, another one should be used if found.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 bool is_supported_partially_(const GUID& p_owner, t_size p_param1, const void* p_param2, t_size p_param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 class NOVTABLE packet_decoder_entry_v2 : public packet_decoder_entry {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 FB2K_MAKE_SERVICE_INTERFACE(packet_decoder_entry_v2, packet_decoder_entry);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 //! Returns true if this is not the preferred decoder for this format, another one should be used if found.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 virtual bool is_supported_partially(const GUID& p_owner, t_size p_param1, const void* p_param2, t_size p_param2size) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 template<class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 class packet_decoder_entry_impl_t : public packet_decoder_entry_v2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 bool is_our_setup(const GUID & p_owner,t_size p_param1,const void * p_param2,t_size p_param2size) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 return T::g_is_our_setup(p_owner,p_param1,p_param2,p_param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 void open(service_ptr_t<packet_decoder> & p_out,bool p_decode,const GUID & p_owner,t_size p_param1,const void * p_param2,t_size p_param2size,abort_callback & p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 PFC_ASSERT(is_our_setup(p_owner,p_param1,p_param2,p_param2size));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 service_ptr_t<T> instance = new service_impl_t<T>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 instance->open(p_owner,p_decode,p_param1,p_param2,p_param2size,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 p_out = instance.get_ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 bool is_supported_partially(const GUID& p_owner, t_size p_param1, const void* p_param2, t_size p_param2size) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 return T::g_is_supported_partially(p_owner, p_param1, p_param2, p_param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 class packet_decoder_factory_t : public service_factory_single_t<packet_decoder_entry_impl_t<T> > {};