annotate foosdk/sdk/foobar2000/helpers/packet_decoder_mp3_common.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 <SDK/packet_decoder.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 Helper code with common MP3 packet_decoder functionality. Primarily meant for foo_input_std-internal use.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 class packet_decoder_mp3_common : public packet_decoder {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 static unsigned parseDecoderSetup( 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
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 static unsigned layer_from_frame(const void *, size_t);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 static unsigned get_max_frame_dependency_() {return 10;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 static double get_max_frame_dependency_time_() {return 10.0 * 1152.0 / 32000.0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16
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 template<typename impl_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 class packet_decoder_mp3 : public packet_decoder
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 impl_t m_decoder;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 unsigned m_layer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 void init(unsigned p_layer) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 m_layer = p_layer;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 m_decoder.reset_after_seek();
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 bool m_MP4fixes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 packet_decoder_mp3() : m_layer(0), m_MP4fixes()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 ~packet_decoder_mp3()
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 t_size set_stream_property(const GUID & p_type, t_size p_param1, const void * p_param2, t_size p_param2size) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 return m_decoder.set_stream_property(p_type, p_param1, p_param2, p_param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 void get_info(file_info & p_info)
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 switch (m_layer)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 case 1: p_info.info_set("codec", "MP1"); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 case 2: p_info.info_set("codec", "MP2"); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 case 3: p_info.info_set("codec", "MP3"); break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 throw exception_io_data();
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 p_info.info_set("encoding", "lossy");
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 unsigned get_max_frame_dependency() { return 10; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 double get_max_frame_dependency_time() { return 10.0 * 1152.0 / 32000.0; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 static bool g_is_our_setup(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
61 return packet_decoder_mp3_common::parseDecoderSetup(p_owner, p_param1, p_param2, p_param2size) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 }
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 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)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 m_MP4fixes = (p_owner == owner_MP4);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 unsigned layer = packet_decoder_mp3_common::parseDecoderSetup(p_owner, p_param1, p_param2, p_param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 if (layer == 0) throw exception_io_data();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 init(layer);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 void reset_after_seek() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 m_decoder.reset_after_seek();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 void decode(const void * p_buffer, t_size p_bytes, audio_chunk & p_chunk, abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 m_decoder.decode(p_buffer, p_bytes, p_chunk, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 bool analyze_first_frame_supported() { return m_MP4fixes; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 void analyze_first_frame(const void * p_buffer, t_size p_bytes, abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 m_layer = packet_decoder_mp3_common::layer_from_frame(p_buffer, p_bytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 };