[FFmpeg-devel] [PATCH 1/3] lavc: skip initial silence when requested

Michael Niedermayer michaelni at gmx.at
Thu Jul 12 22:32:42 CEST 2012


Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
 libavcodec/internal.h |    5 +++++
 libavcodec/utils.c    |   18 ++++++++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index 49c1a18..993c42f 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -84,6 +84,11 @@ typedef struct AVCodecInternal {
     unsigned int byte_buffer_size;
 
     void *frame_thread_encoder;
+
+    /**
+     * Number of audio samples to skip at the start of the next decoded frame
+     */
+    int skip_samples;
 } AVCodecInternal;
 
 struct AVCodecDefault {
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index a326815..25267da 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -1623,6 +1623,8 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
     }
 
     if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size) {
+        uint8_t *side;
+        int side_size;
         // copy to ensure we do not change avpkt
         AVPacket tmp = *avpkt;
         int did_split = av_packet_split_side_data(&tmp);
@@ -1641,6 +1643,22 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
                 frame->sample_rate = avctx->sample_rate;
         }
 
+        side= av_packet_get_side_data(avctx->pkt, AV_PKT_DATA_SKIP_SAMPLES, &side_size);
+        if(side && side_size>=10) {
+            avctx->internal->skip_samples = AV_RL32(side);
+        }
+        if (avctx->internal->skip_samples) {
+            if(frame->nb_samples <= avctx->internal->skip_samples){
+                *got_frame_ptr = 0;
+                avctx->internal->skip_samples -= frame->nb_samples;
+            } else {
+                av_samples_copy(frame->extended_data, frame->extended_data, 0, avctx->internal->skip_samples,
+                                frame->nb_samples - avctx->internal->skip_samples, avctx->channels, frame->format);
+                frame->nb_samples -= avctx->internal->skip_samples;
+                avctx->internal->skip_samples = 0;
+            }
+        }
+
         avctx->pkt = NULL;
         if (did_split) {
             ff_packet_free_side_data(&tmp);
-- 
1.7.9.5



More information about the ffmpeg-devel mailing list