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