[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