From 0c98f640840af33020db572c607be6f7879d246b Mon Sep 17 00:00:00 2001 From: Mike Melanson Date: Tue, 1 Mar 2005 04:50:44 +0000 Subject: different but more consistent hack for CBR audio with no extended header; works no better or worse than before since stereo MACE still does not work (interaction problem with FFmpeg?); log PCM in QT still does not work CVS patchset: 7426 CVS date: 2005/03/01 04:50:44 --- src/demuxers/demux_qt.c | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c index 498319f2d..778a047ad 100644 --- a/src/demuxers/demux_qt.c +++ b/src/demuxers/demux_qt.c @@ -30,7 +30,7 @@ * build_frame_table * free_qt_info * - * $Id: demux_qt.c,v 1.198 2005/02/06 15:26:18 tmattern Exp $ + * $Id: demux_qt.c,v 1.199 2005/03/01 04:50:44 tmmm Exp $ * */ @@ -95,6 +95,10 @@ typedef unsigned int qt_atom; #define AVCC_ATOM QT_ATOM('a', 'v', 'c', 'C') #define IMA4_FOURCC ME_FOURCC('i', 'm', 'a', '4') +#define MAC3_FOURCC ME_FOURCC('M', 'A', 'C', '3') +#define MAC6_FOURCC ME_FOURCC('M', 'A', 'C', '6') +#define ULAW_FOURCC ME_FOURCC('u', 'l', 'a', 'w') +#define ALAW_FOURCC ME_FOURCC('a', 'l', 'a', 'w') #define MP4A_FOURCC ME_FOURCC('m', 'p', '4', 'a') #define SAMR_FOURCC ME_FOURCC('s', 'a', 'm', 'r') #define ALAC_FOURCC ME_FOURCC('a', 'l', 'a', 'c') @@ -1082,8 +1086,8 @@ static qt_error parse_trak_atom (qt_trak *trak, trak->stsd_atoms[k].audio.bytes_per_packet = trak->stsd_atoms[k].audio.bytes_per_sample; - /* special case time: some ima4-encoded files don't have the - * extra header; compensate */ + /* special case time: A lot of CBR audio codecs stored in the + * early days lacked the extra header; compensate */ if (trak->stsd_atoms[k].audio.codec_fourcc == IMA4_FOURCC) { trak->stsd_atoms[k].audio.samples_per_packet = 64; trak->stsd_atoms[k].audio.bytes_per_packet = 34; @@ -1092,6 +1096,38 @@ static qt_error parse_trak_atom (qt_trak *trak, trak->stsd_atoms[k].audio.bytes_per_sample = 2; trak->stsd_atoms[k].audio.samples_per_frame = 64 * trak->stsd_atoms[k].audio.channels; + } else if (trak->stsd_atoms[k].audio.codec_fourcc == MAC3_FOURCC) { + trak->stsd_atoms[k].audio.samples_per_packet = 3; + trak->stsd_atoms[k].audio.bytes_per_packet = 1; + trak->stsd_atoms[k].audio.bytes_per_frame = 1 * + trak->stsd_atoms[k].audio.channels; + trak->stsd_atoms[k].audio.bytes_per_sample = 1; + trak->stsd_atoms[k].audio.samples_per_frame = 3 * + trak->stsd_atoms[k].audio.channels; + } else if (trak->stsd_atoms[k].audio.codec_fourcc == MAC6_FOURCC) { + trak->stsd_atoms[k].audio.samples_per_packet = 6; + trak->stsd_atoms[k].audio.bytes_per_packet = 1; + trak->stsd_atoms[k].audio.bytes_per_frame = 1 * + trak->stsd_atoms[k].audio.channels; + trak->stsd_atoms[k].audio.bytes_per_sample = 1; + trak->stsd_atoms[k].audio.samples_per_frame = 6 * + trak->stsd_atoms[k].audio.channels; + } else if (trak->stsd_atoms[k].audio.codec_fourcc == ALAW_FOURCC) { + trak->stsd_atoms[k].audio.samples_per_packet = 1; + trak->stsd_atoms[k].audio.bytes_per_packet = 1; + trak->stsd_atoms[k].audio.bytes_per_frame = 1 * + trak->stsd_atoms[k].audio.channels; + trak->stsd_atoms[k].audio.bytes_per_sample = 2; + trak->stsd_atoms[k].audio.samples_per_frame = 2 * + trak->stsd_atoms[k].audio.channels; + } else if (trak->stsd_atoms[k].audio.codec_fourcc == ULAW_FOURCC) { + trak->stsd_atoms[k].audio.samples_per_packet = 1; + trak->stsd_atoms[k].audio.bytes_per_packet = 1; + trak->stsd_atoms[k].audio.bytes_per_frame = 1 * + trak->stsd_atoms[k].audio.channels; + trak->stsd_atoms[k].audio.bytes_per_sample = 2; + trak->stsd_atoms[k].audio.samples_per_frame = 2 * + trak->stsd_atoms[k].audio.channels; } /* it's time to dig a little deeper to determine the real audio @@ -2357,12 +2393,6 @@ static int demux_qt_send_chunk(demux_plugin_t *this_gen) { remaining_sample_bytes = audio_trak->frames[i].size; - /* HACK: MAC3 and MAC6 have wrong frame size */ - if (audio_trak->properties->audio.codec_buftype == BUF_AUDIO_MAC3) - remaining_sample_bytes /= 3; - else if (audio_trak->properties->audio.codec_buftype == BUF_AUDIO_MAC6) - remaining_sample_bytes /= 6; - this->input->seek(this->input, audio_trak->frames[i].offset, SEEK_SET); -- cgit v1.2.3