9 #include "ad_internal.h"
10 #include "libaf/reorder_ch.h"
12 static ad_info_t info
=
14 "Ogg/Vorbis audio decoder",
20 "Felix Buenemann, A'rpi",
25 LIBAD_EXTERN(libvorbis
)
28 #include <tremor/ivorbiscodec.h>
30 #include <vorbis/codec.h>
33 // This struct is also defined in demux_ogg.c => common header ?
34 typedef struct ov_struct_st
{
35 vorbis_info vi
; /* struct that stores all the static vorbis bitstream
37 vorbis_comment vc
; /* struct that stores all the bitstream user comments */
38 vorbis_dsp_state vd
; /* central working state for the packet->PCM decoder */
39 vorbis_block vb
; /* local working space for packet->PCM decode */
40 float rg_scale
; /* replaygain scale */
46 static int read_vorbis_comment( char* ptr
, const char* comment
, const char* format
, ... ) {
50 va_start( va
, format
);
51 clen
= strlen( comment
);
52 ret
= strncasecmp( ptr
, comment
, clen
) == 0 ? vsscanf( ptr
+clen
, format
, va
) : 0;
58 static int preinit(sh_audio_t
*sh
)
60 sh
->audio_out_minsize
=1024*4; // 1024 samples/frame
64 static int init(sh_audio_t
*sh
)
66 unsigned int offset
, i
, length
, hsizes
[3];
68 unsigned char* extradata
;
71 struct ov_struct_st
*ov
;
73 vorbis_comment_clear(&vc); \
74 vorbis_info_clear(&ov->vi); \
79 /// Init the decoder with the 3 header packets
80 ov
= malloc(sizeof(struct ov_struct_st
));
81 vorbis_info_init(&ov
->vi
);
82 vorbis_comment_init(&vc
);
85 mp_msg(MSGT_DECAUDIO
,MSGL_ERR
,"ad_vorbis, extradata seems to be absent! exit\n");
89 if(! sh
->wf
->cbSize
) {
90 mp_msg(MSGT_DECAUDIO
,MSGL_ERR
,"ad_vorbis, extradata seems to be absent!, exit\n");
94 mp_msg(MSGT_DECAUDIO
,MSGL_V
,"ad_vorbis, extradata seems is %d bytes long\n", sh
->wf
->cbSize
);
95 extradata
= (char*) (sh
->wf
+1);
97 mp_msg(MSGT_DECAUDIO
,MSGL_ERR
,"ad_vorbis, extradata seems to be NULL!, exit\n");
101 if(*extradata
!= 2) {
102 mp_msg (MSGT_DEMUX
, MSGL_WARN
, "ad_vorbis: Vorbis track does not contain valid headers.\n");
107 for (i
=0; i
< 2; i
++) {
109 while ((extradata
[offset
] == (unsigned char) 0xFF) && length
< sh
->wf
->cbSize
) {
113 if(offset
>= (sh
->wf
->cbSize
- 1)) {
114 mp_msg (MSGT_DEMUX
, MSGL_WARN
, "ad_vorbis: Vorbis track does not contain valid headers.\n");
117 length
+= extradata
[offset
];
119 mp_msg (MSGT_DEMUX
, MSGL_V
, "ad_vorbis, offset: %u, length: %u\n", offset
, length
);
123 headers
[0] = &extradata
[offset
];
124 headers
[1] = &extradata
[offset
+ hsizes
[0]];
125 headers
[2] = &extradata
[offset
+ hsizes
[0] + hsizes
[1]];
126 hsizes
[2] = sh
->wf
->cbSize
- offset
- hsizes
[0] - hsizes
[1];
127 mp_msg (MSGT_DEMUX
, MSGL_V
, "ad_vorbis, header sizes: %d %d %d\n", hsizes
[0], hsizes
[1], hsizes
[2]);
130 op
.bytes
= hsizes
[i
];
131 op
.packet
= headers
[i
];
133 if(vorbis_synthesis_headerin(&ov
->vi
,&vc
,&op
) <0) {
134 mp_msg(MSGT_DECAUDIO
,MSGL_ERR
,"OggVorbis: header n. %d broken! len=%ld\n", i
, op
.bytes
);
138 float rg_gain
=0.f
, rg_peak
=0.f
;
139 char **ptr
=vc
.user_comments
;
141 mp_msg(MSGT_DECAUDIO
,MSGL_V
,"OggVorbisComment: %s\n",*ptr
);
143 read_vorbis_comment( *ptr
, "replaygain_album_gain=", "%f", &rg_gain
);
144 read_vorbis_comment( *ptr
, "rg_audiophile=", "%f", &rg_gain
);
146 read_vorbis_comment( *ptr
, "replaygain_track_gain=", "%f", &rg_gain
);
147 read_vorbis_comment( *ptr
, "rg_radio=", "%f", &rg_gain
);
149 read_vorbis_comment( *ptr
, "replaygain_album_peak=", "%f", &rg_peak
);
151 read_vorbis_comment( *ptr
, "replaygain_track_peak=", "%f", &rg_peak
);
152 read_vorbis_comment( *ptr
, "rg_peak=", "%f", &rg_peak
);
156 /* replaygain: scale */
158 ov
->rg_scale
= 1.f
; /* just in case pow() isn't standard-conformant */
160 ov
->rg_scale
= pow(10.f
, rg_gain
/20);
161 /* replaygain: anticlip */
162 if(ov
->rg_scale
* rg_peak
> 1.f
)
163 ov
->rg_scale
= 1.f
/ rg_peak
;
164 /* replaygain: security */
165 if(ov
->rg_scale
> 15.)
168 ov
->rg_scale_int
= (int)(ov
->rg_scale
*64.f
);
170 mp_msg(MSGT_DECAUDIO
,MSGL_V
,"OggVorbis: Bitstream is %d channel%s, %dHz, %dbit/s %cBR\n",(int)ov
->vi
.channels
,ov
->vi
.channels
>1?"s":"",(int)ov
->vi
.rate
,(int)ov
->vi
.bitrate_nominal
,
171 (ov
->vi
.bitrate_lower
!=ov
->vi
.bitrate_nominal
)||(ov
->vi
.bitrate_upper
!=ov
->vi
.bitrate_nominal
)?'V':'C');
172 if(rg_gain
|| rg_peak
)
173 mp_msg(MSGT_DECAUDIO
,MSGL_V
,"OggVorbis: Gain = %+.2f dB, Peak = %.4f, Scale = %.2f\n", rg_gain
, rg_peak
, ov
->rg_scale
);
174 mp_msg(MSGT_DECAUDIO
,MSGL_V
,"OggVorbis: Encoded by: %s\n",vc
.vendor
);
178 vorbis_comment_clear(&vc
);
180 // printf("lower=%d upper=%d \n",(int)ov->vi.bitrate_lower,(int)ov->vi.bitrate_upper);
183 sh
->channels
=ov
->vi
.channels
;
184 sh
->samplerate
=ov
->vi
.rate
;
186 // assume 128kbit if bitrate not specified in the header
187 sh
->i_bps
=((ov
->vi
.bitrate_nominal
>0) ? ov
->vi
.bitrate_nominal
: 128000)/8;
190 /// Finish the decoder init
191 vorbis_synthesis_init(&ov
->vd
,&ov
->vi
);
192 vorbis_block_init(&ov
->vd
,&ov
->vb
);
193 mp_msg(MSGT_DECAUDIO
,MSGL_V
,"OggVorbis: Init OK!\n");
198 static void uninit(sh_audio_t
*sh
)
200 struct ov_struct_st
*ov
= sh
->context
;
201 vorbis_dsp_clear(&ov
->vd
);
202 vorbis_block_clear(&ov
->vb
);
203 vorbis_info_clear(&ov
->vi
);
207 static int control(sh_audio_t
*sh
,int cmd
,void* arg
, ...)
212 case ADCTRL_RESYNC_STREAM
:
214 case ADCTRL_SKIP_FRAME
:
218 return CONTROL_UNKNOWN
;
221 static int decode_audio(sh_audio_t
*sh
,unsigned char *buf
,int minlen
,int maxlen
)
231 struct ov_struct_st
*ov
= sh
->context
;
232 while(len
< minlen
) {
233 while((samples
=vorbis_synthesis_pcmout(&ov
->vd
,&pcm
))<=0){
236 memset(&op
,0,sizeof(op
)); //op.b_o_s = op.e_o_s = 0;
237 op
.bytes
= ds_get_packet_pts(sh
->ds
,&op
.packet
, &pts
);
238 if(op
.bytes
<=0) break;
239 if (pts
!= MP_NOPTS_VALUE
) {
243 if(vorbis_synthesis(&ov
->vb
,&op
)==0) /* test for success! */
244 vorbis_synthesis_blockin(&ov
->vd
,&ov
->vb
);
246 if(samples
<=0) break; // error/EOF
250 int convsize
=(maxlen
-len
)/(2*ov
->vi
.channels
); // max size!
251 int bout
=((samples
<convsize
)?samples
:convsize
);
253 if(bout
<=0) break; // no buffer space
255 /* convert floats to 16 bit signed ints (host order) and
258 if (ov
->rg_scale_int
== 64) {
259 for(i
=0;i
<ov
->vi
.channels
;i
++){
260 ogg_int16_t
*convbuffer
=(ogg_int16_t
*)(&buf
[len
]);
261 ogg_int16_t
*ptr
=convbuffer
+i
;
262 ogg_int32_t
*mono
=pcm
[i
];
265 /* might as well guard against clipping */
275 ptr
+=ov
->vi
.channels
;
279 #endif /* CONFIG_TREMOR */
281 #ifndef CONFIG_TREMOR
282 scale
= 32767.f
* ov
->rg_scale
;
284 for(i
=0;i
<ov
->vi
.channels
;i
++){
285 ogg_int16_t
*convbuffer
=(ogg_int16_t
*)(&buf
[len
]);
286 ogg_int16_t
*ptr
=convbuffer
+i
;
288 ogg_int32_t
*mono
=pcm
[i
];
290 int val
=(mono
[j
]*ov
->rg_scale_int
)>>(9+6);
294 int val
=mono
[j
]*scale
;
295 /* might as well guard against clipping */
304 #endif /* CONFIG_TREMOR */
306 ptr
+=ov
->vi
.channels
;
312 mp_msg(MSGT_DECAUDIO
,MSGL_DBG2
,"Clipping in frame %ld\n",(long)(ov
->vd
.sequence
));
313 len
+=2*ov
->vi
.channels
*bout
;
314 sh
->pts_bytes
+= 2*ov
->vi
.channels
*bout
;
315 mp_msg(MSGT_DECAUDIO
,MSGL_DBG2
,"\n[decoded: %d / %d ]\n",bout
,samples
);
317 vorbis_synthesis_read(&ov
->vd
,bout
); /* tell libvorbis how
321 // if (!samples) break; // why? how?
324 if (len
> 0 && ov
->vi
.channels
>= 5) {
325 reorder_channel_nch(buf
, AF_CHANNEL_LAYOUT_VORBIS_DEFAULT
,
326 AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT
,
327 ov
->vi
.channels
, len
/ sh
->samplesize
,