[FFmpeg-devel] [PATCH] lavc/utils: Add support for discarding samples from the end

Michael Niedermayer michaelni at gmx.at
Tue Sep 10 20:59:12 CEST 2013


On Tue, Sep 10, 2013 at 11:17:33AM -0700, Vignesh Venkatasubramanian wrote:
> On Tue, Sep 10, 2013 at 11:08 AM, Vignesh Venkatasubramanian
> <vigneshv at google.com> wrote:
> > Adding support for discarding samples from the end based on the value in
> > AV_PKT_DATA_SKIP_SAMPLES side data's bytes 5-8.
> >
> > Signed-off By: Vignesh Venkatasubramanian <vigneshv at google.com>
> > ---
> >  libavcodec/utils.c | 21 +++++++++++++++++++++
> >  1 file changed, 21 insertions(+)
> >
> > diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> > index 7f361ef..1b1bc4d 100644
> > --- a/libavcodec/utils.c
> > +++ b/libavcodec/utils.c
> > @@ -2112,6 +2112,7 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
> >      if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type & FF_THREAD_FRAME)) {
> >          uint8_t *side;
> >          int side_size;
> > +        uint32_t discard_padding = 0;
> >          // copy to ensure we do not change avpkt
> >          AVPacket tmp = *avpkt;
> >          int did_split = av_packet_split_side_data(&tmp);
> > @@ -2146,6 +2147,7 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
> >              avctx->internal->skip_samples = AV_RL32(side);
> >              av_log(avctx, AV_LOG_DEBUG, "skip %d samples due to side data\n",
> >                     avctx->internal->skip_samples);
> > +            discard_padding = AV_RL32(side + 4);
> >          }
> >          if (avctx->internal->skip_samples && *got_frame_ptr) {
> >              if(frame->nb_samples <= avctx->internal->skip_samples){
> > @@ -2176,6 +2178,25 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
> >              }
> >          }
> >
> > +        if (discard_padding > 0 && *got_frame_ptr) {
> > +            if (discard_padding == frame->nb_samples) {
> > +                *got_frame_ptr = 0;
> > +            } else {
> > +                if(avctx->pkt_timebase.num && avctx->sample_rate) {
> > +                    int64_t diff_ts = av_rescale_q(frame->nb_samples - discard_padding,
> > +                                                   (AVRational){1, avctx->sample_rate},
> > +                                                   avctx->pkt_timebase);
> > +                    if (av_frame_get_pkt_duration(frame) >= diff_ts)
> > +                        av_frame_set_pkt_duration(frame, av_frame_get_pkt_duration(frame) - diff_ts);
> > +                } else {
> > +                    av_log(avctx, AV_LOG_WARNING, "Could not update timestamps for discarded samples.\n");
> > +                }
> > +                av_log(avctx, AV_LOG_DEBUG, "discard %d/%d samples\n",
> > +                       discard_padding, frame->nb_samples);
> > +                frame->nb_samples -= discard_padding;
> 
> the earlier comment on this was: "use of untrusted and unchecked
> values for changing array dimensions". could
> you please tell me how to check the value? I am doing pretty much the
> same thing as
> avctx->internal->skip_samples in the previous block.

discard_padding should be checked to be within 0..frame->nb_samples
otherwise nb_samples could become negative and that surely isnt
good


[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

You can kill me, but you cannot change the truth.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130910/990bb18b/attachment.asc>


More information about the ffmpeg-devel mailing list