[FFmpeg-devel] [PATCH 2/2] avisynth: Use av_packet_from_data instead of av_new_packet

wm4 nfxjfg at googlemail.com
Wed Jan 8 19:32:49 CET 2014


On Wed,  8 Jan 2014 00:37:57 -0500
Stephen Hutchinson <qyot27 at gmail.com> wrote:

> If the audio changes from 9eac7c4 were merged as they were, this
> would cause scripts with both video+audio to fail with a lot of
> audio decoding errors (the video would be fine). Scripts with
> only one of either video or audio were unaffected. Additionally,
> the av_packet changes in general caused seeking to break.
> 
> Using av_packet_from_data allows video+audio scripts to work as
> expected, without audio decoding errors.  It also fixes seeking.
> ---
>  libavformat/avisynth.c | 20 ++++++++++++++++----
>  1 file changed, 16 insertions(+), 4 deletions(-)
> 
> diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c
> index 66f85ec..99fe34c 100644
> --- a/libavformat/avisynth.c
> +++ b/libavformat/avisynth.c
> @@ -421,7 +421,7 @@ static int avisynth_read_packet_video(AVFormatContext *s, AVPacket *pkt,
>      AVS_VideoFrame *frame;
>      unsigned char *dst_p;
>      const unsigned char *src_p;
> -    int n, i, plane, rowsize, planeheight, pitch, bits;
> +    int n, i, plane, rowsize, planeheight, pitch, bits, ret;
>      const char *error;
>  
>      if (avs->curr_frame >= avs->vi->num_frames)
> @@ -460,9 +460,15 @@ static int avisynth_read_packet_video(AVFormatContext *s, AVPacket *pkt,
>      if (!pkt->size)
>          return AVERROR_UNKNOWN;
>  
> -    if (av_new_packet(pkt, pkt->size) < 0)
> +    pkt->data = av_malloc(pkt->size);
> +    if (!pkt->data)
>          return AVERROR(ENOMEM);
>  
> +    if ((ret = av_packet_from_data(pkt, pkt->data, pkt->size)) < 0) {
> +        av_packet_unref(pkt);
> +        return ret;
> +    }
> +

I don't understand this at all. av_new_packet() should be the function
to use. Your patch is probably working around an av_new_packet() bug.
That function calls av_buffer_realloc(), instead of actually creating a
buffer. Sounds very wrong.

>      frame = avs_library.avs_get_frame(avs->clip, n);
>      error = avs_library.avs_clip_get_error(avs->clip);
>      if (error) {
> @@ -511,7 +517,7 @@ static int avisynth_read_packet_audio(AVFormatContext *s, AVPacket *pkt,
>  {
>      AviSynthContext *avs = s->priv_data;
>      AVRational fps, samplerate;
> -    int samples;
> +    int samples, ret;
>      int64_t n;
>      const char *error;
>  
> @@ -558,9 +564,15 @@ static int avisynth_read_packet_audio(AVFormatContext *s, AVPacket *pkt,
>      if (!pkt->size)
>          return AVERROR_UNKNOWN;
>  
> -    if (av_new_packet(pkt, pkt->size) < 0)
> +    pkt->data = av_malloc(pkt->size);
> +    if (!pkt->data)
>          return AVERROR(ENOMEM);
>  
> +    if ((ret = av_packet_from_data(pkt, pkt->data, pkt->size)) < 0) {
> +        av_packet_unref(pkt);
> +        return ret;
> +    }
> +
>      avs_library.avs_get_audio(avs->clip, pkt->data, n, samples);
>      error = avs_library.avs_clip_get_error(avs->clip);
>      if (error) {



More information about the ffmpeg-devel mailing list