Mercurial > mplayer.hg
comparison libmpdemux/demux_realaud.c @ 17149:9a0a376a54b1
Move audio packets reordering from codec interface to demuxers for real
files (old and new format), pass only real extradata to the codec
Enable cook codec from lavc, prefer lavc codecs for 14_4 and 28_8
formats. Disable internal 28_8, it's broken now and will be removed soon
author | rtognimp |
---|---|
date | Fri, 09 Dec 2005 16:25:37 +0000 |
parents | 9cb2b9b6a9b7 |
children | 7dd65dccf4f5 |
comparison
equal
deleted
inserted
replaced
17148:d29d6028a943 | 17149:9a0a376a54b1 |
---|---|
34 unsigned int coded_framesize; | 34 unsigned int coded_framesize; |
35 unsigned short sub_packet_h; | 35 unsigned short sub_packet_h; |
36 unsigned short frame_size; | 36 unsigned short frame_size; |
37 unsigned short sub_packet_size; | 37 unsigned short sub_packet_size; |
38 char genr[4]; | 38 char genr[4]; |
39 char * audio_buf; | |
39 } ra_priv_t; | 40 } ra_priv_t; |
40 | 41 |
41 | 42 |
42 | 43 |
43 static int ra_check_file(demuxer_t* demuxer) | 44 static int ra_check_file(demuxer_t* demuxer) |
66 int flags; | 67 int flags; |
67 demux_stream_t *ds = demuxer->audio; | 68 demux_stream_t *ds = demuxer->audio; |
68 sh_audio_t *sh = ds->sh; | 69 sh_audio_t *sh = ds->sh; |
69 WAVEFORMATEX *wf = sh->wf; | 70 WAVEFORMATEX *wf = sh->wf; |
70 demux_packet_t *dp; | 71 demux_packet_t *dp; |
72 int x, y; | |
71 | 73 |
72 if (demuxer->stream->eof) | 74 if (demuxer->stream->eof) |
73 return 0; | 75 return 0; |
74 | 76 |
75 len = wf->nBlockAlign; | 77 len = wf->nBlockAlign; |
76 demuxer->filepos = stream_tell(demuxer->stream); | 78 demuxer->filepos = stream_tell(demuxer->stream); |
77 | 79 |
80 if (sh->format == FOURCC_288) { | |
81 for (y = 0; y < ra_priv->sub_packet_h; y++) | |
82 for (x = 0; x < ra_priv->sub_packet_h / 2; x++) | |
83 stream_read(demuxer->stream, ra_priv->audio_buf + x * 2 *ra_priv->frame_size + | |
84 y * ra_priv->coded_framesize, ra_priv->coded_framesize); | |
85 // Release all the audio packets | |
86 for (x = 0; x < ra_priv->sub_packet_h * ra_priv->frame_size / len; x++) { | |
87 dp = new_demux_packet(len); | |
88 memcpy(dp->buffer, ra_priv->audio_buf + x * len, len); | |
89 dp->pts = x ? 0 : demuxer->filepos / ra_priv->data_size; | |
90 dp->pos = demuxer->filepos; // all equal | |
91 dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe | |
92 ds_add_packet(ds, dp); | |
93 } | |
94 } else { | |
78 dp = new_demux_packet(len); | 95 dp = new_demux_packet(len); |
79 stream_read(demuxer->stream, dp->buffer, len); | 96 stream_read(demuxer->stream, dp->buffer, len); |
80 | 97 |
81 dp->pts = demuxer->filepos / ra_priv->data_size; | 98 dp->pts = demuxer->filepos / ra_priv->data_size; |
82 dp->pos = demuxer->filepos; | 99 dp->pos = demuxer->filepos; |
83 dp->flags = 0; | 100 dp->flags = 0; |
84 ds_add_packet(ds, dp); | 101 ds_add_packet(ds, dp); |
102 } | |
85 | 103 |
86 return 1; | 104 return 1; |
87 } | 105 } |
88 | 106 |
89 | 107 |
232 sh->wf->wFormatTag = sh->format; | 250 sh->wf->wFormatTag = sh->format; |
233 | 251 |
234 switch (sh->format) { | 252 switch (sh->format) { |
235 case FOURCC_144: | 253 case FOURCC_144: |
236 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: 14_4\n"); | 254 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: 14_4\n"); |
237 sh->wf->cbSize = 10/*+codecdata_length*/; | 255 sh->wf->nBlockAlign = 0x14; |
238 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize); | |
239 ((short*)(sh->wf+1))[0]=0; | |
240 ((short*)(sh->wf+1))[1]=240; | |
241 ((short*)(sh->wf+1))[2]=0; | |
242 ((short*)(sh->wf+1))[3]=0x14; | |
243 ((short*)(sh->wf+1))[4]=0; | |
244 break; | 256 break; |
245 case FOURCC_288: | 257 case FOURCC_288: |
246 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: 28_8\n"); | 258 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: 28_8\n"); |
247 sh->wf->cbSize = 10/*+codecdata_length*/; | 259 sh->wf->nBlockAlign = ra_priv->coded_framesize; |
248 sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize); | 260 ra_priv->audio_buf = malloc(ra_priv->sub_packet_h * ra_priv->frame_size); |
249 ((short*)(sh->wf+1))[0]=0; | |
250 ((short*)(sh->wf+1))[1]=ra_priv->sub_packet_h; | |
251 ((short*)(sh->wf+1))[2]=ra_priv->codec_flavor; | |
252 ((short*)(sh->wf+1))[3]=ra_priv->coded_framesize; | |
253 ((short*)(sh->wf+1))[4]=0; | |
254 break; | 261 break; |
255 case FOURCC_DNET: | 262 case FOURCC_DNET: |
256 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: DNET -> AC3\n"); | 263 mp_msg(MSGT_DEMUX,MSGL_V,"Audio: DNET -> AC3\n"); |
257 break; | 264 break; |
258 default: | 265 default: |
274 | 281 |
275 static void demux_close_ra(demuxer_t *demuxer) | 282 static void demux_close_ra(demuxer_t *demuxer) |
276 { | 283 { |
277 ra_priv_t* ra_priv = demuxer->priv; | 284 ra_priv_t* ra_priv = demuxer->priv; |
278 | 285 |
279 if (ra_priv) | 286 if (ra_priv) { |
287 if (ra_priv->audio_buf) | |
288 free (ra_priv->audio_buf); | |
280 free(ra_priv); | 289 free(ra_priv); |
281 | 290 } |
282 return; | 291 return; |
283 } | 292 } |
284 | 293 |
285 | 294 |
286 #if 0 | 295 #if 0 |