summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_realaud.c
diff options
context:
space:
mode:
authorrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-12-09 16:25:37 +0000
committerrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-12-09 16:25:37 +0000
commitbda32bc73a2e81524dffab8fe3d3989815fc741d (patch)
tree0da35c3d007c40f92fc603f23083499e4332cfb8 /libmpdemux/demux_realaud.c
parentc5561f6bf179882e111146a8ab67c56bb6ca8896 (diff)
downloadmpv-bda32bc73a2e81524dffab8fe3d3989815fc741d.tar.bz2
mpv-bda32bc73a2e81524dffab8fe3d3989815fc741d.tar.xz
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 git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@17150 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_realaud.c')
-rw-r--r--libmpdemux/demux_realaud.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/libmpdemux/demux_realaud.c b/libmpdemux/demux_realaud.c
index 5ec68bdb00..b553bba09b 100644
--- a/libmpdemux/demux_realaud.c
+++ b/libmpdemux/demux_realaud.c
@@ -36,6 +36,7 @@ typedef struct {
unsigned short frame_size;
unsigned short sub_packet_size;
char genr[4];
+ char * audio_buf;
} ra_priv_t;
@@ -68,6 +69,7 @@ static int demux_ra_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
sh_audio_t *sh = ds->sh;
WAVEFORMATEX *wf = sh->wf;
demux_packet_t *dp;
+ int x, y;
if (demuxer->stream->eof)
return 0;
@@ -75,6 +77,21 @@ static int demux_ra_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
len = wf->nBlockAlign;
demuxer->filepos = stream_tell(demuxer->stream);
+ if (sh->format == FOURCC_288) {
+ for (y = 0; y < ra_priv->sub_packet_h; y++)
+ for (x = 0; x < ra_priv->sub_packet_h / 2; x++)
+ stream_read(demuxer->stream, ra_priv->audio_buf + x * 2 *ra_priv->frame_size +
+ y * ra_priv->coded_framesize, ra_priv->coded_framesize);
+ // Release all the audio packets
+ for (x = 0; x < ra_priv->sub_packet_h * ra_priv->frame_size / len; x++) {
+ dp = new_demux_packet(len);
+ memcpy(dp->buffer, ra_priv->audio_buf + x * len, len);
+ dp->pts = x ? 0 : demuxer->filepos / ra_priv->data_size;
+ dp->pos = demuxer->filepos; // all equal
+ dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe
+ ds_add_packet(ds, dp);
+ }
+ } else {
dp = new_demux_packet(len);
stream_read(demuxer->stream, dp->buffer, len);
@@ -82,6 +99,7 @@ static int demux_ra_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
dp->pos = demuxer->filepos;
dp->flags = 0;
ds_add_packet(ds, dp);
+ }
return 1;
}
@@ -234,23 +252,12 @@ static demuxer_t* demux_open_ra(demuxer_t* demuxer)
switch (sh->format) {
case FOURCC_144:
mp_msg(MSGT_DEMUX,MSGL_V,"Audio: 14_4\n");
- sh->wf->cbSize = 10/*+codecdata_length*/;
- sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize);
- ((short*)(sh->wf+1))[0]=0;
- ((short*)(sh->wf+1))[1]=240;
- ((short*)(sh->wf+1))[2]=0;
- ((short*)(sh->wf+1))[3]=0x14;
- ((short*)(sh->wf+1))[4]=0;
+ sh->wf->nBlockAlign = 0x14;
break;
case FOURCC_288:
mp_msg(MSGT_DEMUX,MSGL_V,"Audio: 28_8\n");
- sh->wf->cbSize = 10/*+codecdata_length*/;
- sh->wf = realloc(sh->wf, sizeof(WAVEFORMATEX)+sh->wf->cbSize);
- ((short*)(sh->wf+1))[0]=0;
- ((short*)(sh->wf+1))[1]=ra_priv->sub_packet_h;
- ((short*)(sh->wf+1))[2]=ra_priv->codec_flavor;
- ((short*)(sh->wf+1))[3]=ra_priv->coded_framesize;
- ((short*)(sh->wf+1))[4]=0;
+ sh->wf->nBlockAlign = ra_priv->coded_framesize;
+ ra_priv->audio_buf = malloc(ra_priv->sub_packet_h * ra_priv->frame_size);
break;
case FOURCC_DNET:
mp_msg(MSGT_DEMUX,MSGL_V,"Audio: DNET -> AC3\n");
@@ -276,9 +283,11 @@ static void demux_close_ra(demuxer_t *demuxer)
{
ra_priv_t* ra_priv = demuxer->priv;
- if (ra_priv)
+ if (ra_priv) {
+ if (ra_priv->audio_buf)
+ free (ra_priv->audio_buf);
free(ra_priv);
-
+ }
return;
}