summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2006-03-14 00:25:46 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2006-03-14 00:25:46 +0000
commitf4c7b001ab3c9c07c05b7055f652677e0d6aa79b (patch)
tree4c7ff60a1651ecf0e117ef065b35cd633ff9e3c0
parentfc8c49926c23d610f36148781e987512f09194b4 (diff)
fix sample size for uncompressed sound
Originally committed as revision 5165 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavformat/mov.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 76a465b63a..f040c4335f 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1196,8 +1196,33 @@ static int mov_read_stsz(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
#ifdef DEBUG
av_log(NULL, AV_LOG_DEBUG, "sample_size = %ld sample_count = %ld\n", sc->sample_size, sc->sample_count);
#endif
- if(sc->sample_size)
+ if(sc->sample_size) {
+ /* override sample size for uncompressed sound */
+ switch (st->codec->codec_id) {
+ case CODEC_ID_PCM_S32BE:
+ case CODEC_ID_PCM_S32LE:
+ sc->sample_size = 4 * st->codec->channels;
+ break;
+ case CODEC_ID_PCM_S24BE:
+ case CODEC_ID_PCM_S24LE:
+ sc->sample_size = 3 * st->codec->channels;
+ break;
+ case CODEC_ID_PCM_S16BE:
+ case CODEC_ID_PCM_S16LE:
+ sc->sample_size = 2 * st->codec->channels;
+ break;
+ case CODEC_ID_PCM_MULAW:
+ case CODEC_ID_PCM_ALAW:
+ case CODEC_ID_PCM_S8:
+ case CODEC_ID_PCM_U8:
+ sc->sample_size = 1 * st->codec->channels;
+ break;
+ default:
+ break;
+ }
+ assert(sc->sample_size);
return 0; /* there isn't any table following */
+ }
sc->sample_sizes = (long*) av_malloc(entries * sizeof(long));
if (!sc->sample_sizes)
return -1;
@@ -1768,13 +1793,7 @@ again:
for(i=0; i<(sc->sample_to_chunk_sz); i++) {
if( (sc->sample_to_chunk[i].first)<=(sc->next_chunk) )
{
- // I can't figure out why for PCM audio sample_size is always 1
- // (it should actually be channels*bits_per_second/8) but it is.
- AVCodecContext* cod = s->streams[sc->ffindex]->codec;
- if (sc->sample_size == 1 && (cod->codec_id == CODEC_ID_PCM_S16BE || cod->codec_id == CODEC_ID_PCM_S16LE))
- foundsize=(sc->sample_to_chunk[i].count*cod->channels*cod->bits_per_sample)/8;
- else
- foundsize=sc->sample_to_chunk[i].count*sc->sample_size;
+ foundsize=sc->sample_to_chunk[i].count*sc->sample_size;
}
dprintf("sample_to_chunk first=%ld count=%ld, id=%ld\n", sc->sample_to_chunk[i].first, sc->sample_to_chunk[i].count, sc->sample_to_chunk[i].id);
}