[FFmpeg-cvslog] movenc: simplify handling of pcm vs. adpcm vs. other compressed codecs

Justin Ruggles git at videolan.org
Sat Dec 10 02:08:51 CET 2011


ffmpeg | branch: master | Justin Ruggles <justin.ruggles at gmail.com> | Fri Dec  2 15:51:52 2011 -0500| [8e8c51318c1fe4ae61de578f0823b88aa3fe8222] | committer: Justin Ruggles

movenc: simplify handling of pcm vs. adpcm vs. other compressed codecs

Use Sound Sample Description Version 2 for all MOV files.
Updated FATE references accordingly.
Note that ADPCM is treated as compressed audio in version 2.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8e8c51318c1fe4ae61de578f0823b88aa3fe8222
---

 libavformat/movenc.c       |   61 +++++++++++++-------------------------------
 tests/ref/acodec/pcm_s16be |    4 +-
 tests/ref/acodec/pcm_s24be |    4 +-
 tests/ref/acodec/pcm_s32be |    4 +-
 tests/ref/acodec/pcm_s8    |    4 +-
 tests/ref/lavf/mov         |    4 +-
 6 files changed, 28 insertions(+), 53 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index a741c4b..5d770aa 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -418,15 +418,9 @@ static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track)
     uint32_t tag = track->tag;
 
     if (track->mode == MODE_MOV) {
-        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;
-        }
+        if (mov_get_lpcm_flags(track->enc->codec_id))
+            tag = AV_RL32("lpcm");
+        version = 2;
     }
 
     avio_wb32(pb, 0); /* size */
@@ -453,34 +447,18 @@ 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->enc->frame_size);
+        avio_wb32(pb, track->audio_vbr ? track->enc->frame_size : 1);
     } else {
-        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);
-        }
+        /* 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 ||
@@ -2015,9 +1993,6 @@ 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
@@ -2224,21 +2199,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;
-            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){
+            /* set sampleSize for PCM and ADPCM */
+            if (av_get_bits_per_sample(st->codec->codec_id)) {
                 if (!st->codec->block_align) {
-                    av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set for adpcm\n", i);
+                    av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set\n", i);
                     goto error;
                 }
                 track->sampleSize = st->codec->block_align;
-            }else if(st->codec->frame_size > 1){ /* assume compressed audio */
+            }
+            /* 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;
+                }
                 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 708375d..aea4c98 100644
--- a/tests/ref/acodec/pcm_s16be
+++ b/tests/ref/acodec/pcm_s16be
@@ -1,4 +1,4 @@
-a4e18d1ca9ef5b8132a84d43625ddc47 *./tests/data/acodec/pcm_s16be.mov
-1060037 ./tests/data/acodec/pcm_s16be.mov
+dd832e23156643becce8e9d2c24cb31d *./tests/data/acodec/pcm_s16be.mov
+1060073 ./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 1e90d7e..4407af3 100644
--- a/tests/ref/acodec/pcm_s24be
+++ b/tests/ref/acodec/pcm_s24be
@@ -1,4 +1,4 @@
-971d2d2633e41a0326fe2d04a2d0350f *./tests/data/acodec/pcm_s24be.mov
-1589237 ./tests/data/acodec/pcm_s24be.mov
+1b570c296bce03e36e1dfb369190ffb6 *./tests/data/acodec/pcm_s24be.mov
+1589273 ./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 3bbb71d..fc8fb5e 100644
--- a/tests/ref/acodec/pcm_s32be
+++ b/tests/ref/acodec/pcm_s32be
@@ -1,4 +1,4 @@
-fc4f4e3e195bbde037ed31021d229f12 *./tests/data/acodec/pcm_s32be.mov
-2118437 ./tests/data/acodec/pcm_s32be.mov
+249c2ca88e2d8cdaed345e3d446e5bc3 *./tests/data/acodec/pcm_s32be.mov
+2118473 ./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 7a53fdc..01c2240 100644
--- a/tests/ref/acodec/pcm_s8
+++ b/tests/ref/acodec/pcm_s8
@@ -1,4 +1,4 @@
-760f85fb9f4e8aba326fb44ae84c9507 *./tests/data/acodec/pcm_s8.mov
-530837 ./tests/data/acodec/pcm_s8.mov
+f467f8899b2bd11c736d0f4e61efb1c4 *./tests/data/acodec/pcm_s8.mov
+530873 ./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 07404aa..f51b42d 100644
--- a/tests/ref/lavf/mov
+++ b/tests/ref/lavf/mov
@@ -1,3 +1,3 @@
-4a3ad13f0355cb5d119109778d555207 *./tests/data/lavf/lavf.mov
-357681 ./tests/data/lavf/lavf.mov
+8dc82a08a0abb47c822d03a6e408383b *./tests/data/lavf/lavf.mov
+357717 ./tests/data/lavf/lavf.mov
 ./tests/data/lavf/lavf.mov CRC=0x2f6a9b26



More information about the ffmpeg-cvslog mailing list