diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-01-23 02:23:23 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-01-23 02:40:24 +0400 |
commit | 89ddff92a3853d5506287ee77cd091d20e320fb6 (patch) | |
tree | 5a3e909d8fdcadb284aca29529749afb1683eb37 | |
parent | 9c909e8e793f1122af42b07ce18c08840e4bf6e5 (diff) |
Revert "movenc: simplify handling of pcm vs. adpcm vs. other compressed codecs"
This reverts commit 8e8c51318c1fe4ae61de578f0823b88aa3fe8222.
Fixes Ticket873
Conflicts:
tests/ref/acodec/pcm_s16be
tests/ref/acodec/pcm_s24be
tests/ref/acodec/pcm_s32be
tests/ref/acodec/pcm_s8
tests/ref/lavf/mov
Approved-by: Baptiste Coudurier <baptiste.coudurier@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/movenc.c | 61 | ||||
-rw-r--r-- | tests/ref/acodec/pcm_s16be | 4 | ||||
-rw-r--r-- | tests/ref/acodec/pcm_s24be | 4 | ||||
-rw-r--r-- | tests/ref/acodec/pcm_s32be | 4 | ||||
-rw-r--r-- | tests/ref/acodec/pcm_s8 | 4 | ||||
-rw-r--r-- | tests/ref/lavf/mov | 4 |
6 files changed, 53 insertions, 28 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c index c304291858..276353143f 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -464,9 +464,15 @@ static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track) uint32_t tag = track->tag; if (track->mode == MODE_MOV) { - if (mov_get_lpcm_flags(track->enc->codec_id)) - tag = AV_RL32("lpcm"); - version = 2; + if (track->timescale > UINT16_MAX) { + if (mov_get_lpcm_flags(track->enc->codec_id)) + tag = AV_RL32("lpcm"); + version = 2; + } else if (track->audio_vbr || mov_pcm_le_gt16(track->enc->codec_id) || + track->enc->codec_id == CODEC_ID_ADPCM_MS || + track->enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) { + version = 1; + } } avio_wb32(pb, 0); /* size */ @@ -493,18 +499,34 @@ static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track) avio_wb32(pb, av_get_bits_per_sample(track->enc->codec_id)); avio_wb32(pb, mov_get_lpcm_flags(track->enc->codec_id)); avio_wb32(pb, track->sampleSize); - avio_wb32(pb, track->audio_vbr ? track->enc->frame_size : 1); + avio_wb32(pb, track->enc->frame_size); } else { - /* reserved for mp4/3gp */ - avio_wb16(pb, 2); - avio_wb16(pb, 16); - avio_wb16(pb, 0); + if (track->mode == MODE_MOV) { + avio_wb16(pb, track->enc->channels); + if (track->enc->codec_id == CODEC_ID_PCM_U8 || + track->enc->codec_id == CODEC_ID_PCM_S8) + avio_wb16(pb, 8); /* bits per sample */ + else + avio_wb16(pb, 16); + avio_wb16(pb, track->audio_vbr ? -2 : 0); /* compression ID */ + } else { /* reserved for mp4/3gp */ + avio_wb16(pb, 2); + avio_wb16(pb, 16); + avio_wb16(pb, 0); + } avio_wb16(pb, 0); /* packet size (= 0) */ avio_wb16(pb, track->timescale); /* Time scale */ avio_wb16(pb, 0); /* Reserved */ } + if(version == 1) { /* SoundDescription V1 extended info */ + avio_wb32(pb, track->enc->frame_size); /* Samples per packet */ + avio_wb32(pb, track->sampleSize / track->enc->channels); /* Bytes per packet */ + avio_wb32(pb, track->sampleSize); /* Bytes per frame */ + avio_wb32(pb, 2); /* Bytes per sample */ + } + if(track->mode == MODE_MOV && (track->enc->codec_id == CODEC_ID_AAC || track->enc->codec_id == CODEC_ID_AC3 || @@ -2279,6 +2301,9 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) av_log(s, AV_LOG_ERROR, "fatal error, input is not a single packet, implement a AVParser for it\n"); return -1; } + } else if (enc->codec_id == CODEC_ID_ADPCM_MS || + enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) { + samplesInChunk = enc->frame_size; } else if (trk->sampleSize) samplesInChunk = size/trk->sampleSize; else @@ -2520,21 +2545,21 @@ static int mov_write_header(AVFormatContext *s) "or choose different container.\n"); }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO){ track->timescale = st->codec->sample_rate; - /* set sampleSize for PCM and ADPCM */ - if (av_get_bits_per_sample(st->codec->codec_id)) { + if(!st->codec->frame_size && !av_get_bits_per_sample(st->codec->codec_id)) { + av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i); + goto error; + }else if(st->codec->codec_id == CODEC_ID_ADPCM_MS || + st->codec->codec_id == CODEC_ID_ADPCM_IMA_WAV){ if (!st->codec->block_align) { - av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set\n", i); + av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set for adpcm\n", i); goto error; } track->sampleSize = st->codec->block_align; - } - /* set audio_vbr for compressed audio */ - if (av_get_bits_per_sample(st->codec->codec_id) < 8) { - if (!st->codec->frame_size) { - av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i); - goto error; - } + }else if(st->codec->frame_size > 1){ /* assume compressed audio */ track->audio_vbr = 1; + }else{ + st->codec->frame_size = 1; + track->sampleSize = (av_get_bits_per_sample(st->codec->codec_id) >> 3) * st->codec->channels; } if (track->mode != MODE_MOV) { if (track->timescale > UINT16_MAX) { diff --git a/tests/ref/acodec/pcm_s16be b/tests/ref/acodec/pcm_s16be index e1e0607eee..c5b2a9f840 100644 --- a/tests/ref/acodec/pcm_s16be +++ b/tests/ref/acodec/pcm_s16be @@ -1,4 +1,4 @@ -4529713e8b744edb3e62c4e688a3f987 *./tests/data/acodec/pcm_s16be.mov -1059065 ./tests/data/acodec/pcm_s16be.mov +96079f7b65fdbe991e69bb96a3188217 *./tests/data/acodec/pcm_s16be.mov +1059029 ./tests/data/acodec/pcm_s16be.mov 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s16be.acodec.out.wav stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_s24be b/tests/ref/acodec/pcm_s24be index 8a9029dd24..6ebbed2555 100644 --- a/tests/ref/acodec/pcm_s24be +++ b/tests/ref/acodec/pcm_s24be @@ -1,4 +1,4 @@ -8a7b79317738f91a137c7f6519c3df72 *./tests/data/acodec/pcm_s24be.mov -1588265 ./tests/data/acodec/pcm_s24be.mov +74465b486afddaf802300cdbf3b59a11 *./tests/data/acodec/pcm_s24be.mov +1588229 ./tests/data/acodec/pcm_s24be.mov 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s24be.acodec.out.wav stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_s32be b/tests/ref/acodec/pcm_s32be index e6dc46cee5..f6df3adc88 100644 --- a/tests/ref/acodec/pcm_s32be +++ b/tests/ref/acodec/pcm_s32be @@ -1,4 +1,4 @@ -c9f29c97890f69796faa227c3c08c3d8 *./tests/data/acodec/pcm_s32be.mov -2117465 ./tests/data/acodec/pcm_s32be.mov +ac3822c11273a25005dfd6aa64b255df *./tests/data/acodec/pcm_s32be.mov +2117429 ./tests/data/acodec/pcm_s32be.mov 64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s32be.acodec.out.wav stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400 diff --git a/tests/ref/acodec/pcm_s8 b/tests/ref/acodec/pcm_s8 index aa5ce11ee0..4877a77489 100644 --- a/tests/ref/acodec/pcm_s8 +++ b/tests/ref/acodec/pcm_s8 @@ -1,4 +1,4 @@ -bfd442109b661daf8ee7a468d9d6b944 *./tests/data/acodec/pcm_s8.mov -529865 ./tests/data/acodec/pcm_s8.mov +111d465266385298fde83005402ac171 *./tests/data/acodec/pcm_s8.mov +529829 ./tests/data/acodec/pcm_s8.mov 651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm_s8.acodec.out.wav stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400 diff --git a/tests/ref/lavf/mov b/tests/ref/lavf/mov index a28990328b..619489c6b3 100644 --- a/tests/ref/lavf/mov +++ b/tests/ref/lavf/mov @@ -1,3 +1,3 @@ -37c9c1272d9c524b44692e9192d82033 *./tests/data/lavf/lavf.mov -357857 ./tests/data/lavf/lavf.mov +9a0b239ff596da58debcf210dece3985 *./tests/data/lavf/lavf.mov +357821 ./tests/data/lavf/lavf.mov ./tests/data/lavf/lavf.mov CRC=0x2f6a9b26 |