]> git.sesse.net Git - ffmpeg/blobdiff - libavfilter/src_movie.c
overlay: do not leak x/y expressions.
[ffmpeg] / libavfilter / src_movie.c
index c37195a331dea11bef96e71b591edbb37dedeeb9..a0b427d82c53482cce0d0ad585cc44e9b34d2b13 100644 (file)
@@ -57,8 +57,6 @@ typedef struct {
     AVFilterBufferRef *picref;
 
     /* audio-only fields */
-    void *samples_buf;
-    int samples_buf_size;
     int bps;            ///< bytes per sample
     AVPacket pkt, pkt0;
     AVFilterBufferRef *samplesref;
@@ -176,6 +174,11 @@ static av_cold int movie_common_init(AVFilterContext *ctx, const char *args, voi
            movie->seek_point, movie->format_name, movie->file_name,
            movie->stream_index);
 
+    if (!(movie->frame = avcodec_alloc_frame()) ) {
+        av_log(ctx, AV_LOG_ERROR, "Failed to alloc frame\n");
+        return AVERROR(ENOMEM);
+    }
+
     return 0;
 }
 
@@ -188,13 +191,12 @@ static av_cold void movie_common_uninit(AVFilterContext *ctx)
     if (movie->codec_ctx)
         avcodec_close(movie->codec_ctx);
     if (movie->format_ctx)
-        av_close_input_file(movie->format_ctx);
+        avformat_close_input(&movie->format_ctx);
 
     avfilter_unref_buffer(movie->picref);
     av_freep(&movie->frame);
 
     avfilter_unref_buffer(movie->samplesref);
-    av_freep(&movie->samples_buf);
 }
 
 #if CONFIG_MOVIE_FILTER
@@ -207,11 +209,6 @@ static av_cold int movie_init(AVFilterContext *ctx, const char *args, void *opaq
     if ((ret = movie_common_init(ctx, args, opaque, AVMEDIA_TYPE_VIDEO)) < 0)
         return ret;
 
-    if (!(movie->frame = avcodec_alloc_frame()) ) {
-        av_log(ctx, AV_LOG_ERROR, "Failed to alloc frame\n");
-        return AVERROR(ENOMEM);
-    }
-
     movie->w = movie->codec_ctx->width;
     movie->h = movie->codec_ctx->height;
 
@@ -267,6 +264,7 @@ static int movie_get_frame(AVFilterLink *outlink)
                 /* use pkt_dts if pkt_pts is not available */
                 movie->picref->pts = movie->frame->pkt_pts == AV_NOPTS_VALUE ?
                     movie->frame->pkt_dts : movie->frame->pkt_pts;
+
                 if (!movie->frame->sample_aspect_ratio.num)
                     movie->picref->video->sample_aspect_ratio = st->sample_aspect_ratio;
                 av_dlog(outlink->src,
@@ -322,8 +320,8 @@ AVFilter avfilter_vsrc_movie = {
     .uninit        = movie_common_uninit,
     .query_formats = movie_query_formats,
 
-    .inputs    = (AVFilterPad[]) {{ .name = NULL }},
-    .outputs   = (AVFilterPad[]) {{ .name            = "default",
+    .inputs    = (const AVFilterPad[]) {{ .name = NULL }},
+    .outputs   = (const AVFilterPad[]) {{ .name      = "default",
                                     .type            = AVMEDIA_TYPE_VIDEO,
                                     .request_frame   = movie_request_frame,
                                     .config_props    = movie_config_output_props, },
@@ -353,7 +351,8 @@ static int amovie_query_formats(AVFilterContext *ctx)
 
     enum AVSampleFormat sample_fmts[] = { c->sample_fmt, -1 };
     int packing_fmts[] = { AVFILTER_PACKED, -1 };
-    int64_t chlayouts[] = { c->channel_layout, -1 };
+    int64_t chlayouts[] = { c->channel_layout ? c->channel_layout :
+                            av_get_default_channel_layout(c->channels), -1 };
 
     avfilter_set_common_sample_formats (ctx, avfilter_make_format_list(sample_fmts));
     avfilter_set_common_packing_formats(ctx, avfilter_make_format_list(packing_fmts));
@@ -377,7 +376,7 @@ static int amovie_get_samples(AVFilterLink *outlink)
 {
     MovieContext *movie = outlink->src->priv;
     AVPacket pkt;
-    int ret, samples_size, decoded_data_size;
+    int ret, got_frame = 0;
 
     if (!movie->pkt.size && movie->is_done == 1)
         return AVERROR_EOF;
@@ -401,31 +400,27 @@ static int amovie_get_samples(AVFilterLink *outlink)
         }
     }
 
-    /* reallocate the buffer for the decoded samples, if necessary */
-    samples_size =
-        FFMAX(movie->pkt.size*sizeof(movie->bps), AVCODEC_MAX_AUDIO_FRAME_SIZE);
-    if (samples_size > movie->samples_buf_size) {
-        movie->samples_buf = av_fast_realloc(movie->samples_buf,
-                                             &movie->samples_buf_size, samples_size);
-        if (!movie->samples_buf)
-            return AVERROR(ENOMEM);
-    }
-    decoded_data_size = movie->samples_buf_size;
-
     /* decode and update the movie pkt */
-    ret = avcodec_decode_audio3(movie->codec_ctx, movie->samples_buf,
-                                &decoded_data_size, &movie->pkt);
-    if (ret < 0)
+    avcodec_get_frame_defaults(movie->frame);
+    ret = avcodec_decode_audio4(movie->codec_ctx, movie->frame, &got_frame, &movie->pkt);
+    if (ret < 0) {
+        movie->pkt.size = 0;
         return ret;
+    }
     movie->pkt.data += ret;
     movie->pkt.size -= ret;
 
     /* wrap the decoded data in a samplesref */
-    if (decoded_data_size > 0) {
-        int nb_samples = decoded_data_size / movie->bps / movie->codec_ctx->channels;
+    if (got_frame) {
+        int nb_samples = movie->frame->nb_samples;
+        int data_size =
+            av_samples_get_buffer_size(NULL, movie->codec_ctx->channels,
+                                       nb_samples, movie->codec_ctx->sample_fmt, 1);
+        if (data_size < 0)
+            return data_size;
         movie->samplesref =
             avfilter_get_audio_buffer(outlink, AV_PERM_WRITE, nb_samples);
-        memcpy(movie->samplesref->data[0], movie->samples_buf, decoded_data_size);
+        memcpy(movie->samplesref->data[0], movie->frame->data[0], data_size);
         movie->samplesref->pts = movie->pkt.pts;
         movie->samplesref->pos = movie->pkt.pos;
         movie->samplesref->audio->sample_rate = movie->codec_ctx->sample_rate;
@@ -445,8 +440,10 @@ static int amovie_request_frame(AVFilterLink *outlink)
 
     if (movie->is_done)
         return AVERROR_EOF;
-    if ((ret = amovie_get_samples(outlink)) < 0)
-        return ret;
+    do {
+        if ((ret = amovie_get_samples(outlink)) < 0)
+            return ret;
+    } while (!movie->samplesref);
 
     avfilter_filter_samples(outlink, avfilter_ref_buffer(movie->samplesref, ~0));
     avfilter_unref_buffer(movie->samplesref);
@@ -463,8 +460,8 @@ AVFilter avfilter_asrc_amovie = {
     .uninit        = movie_common_uninit,
     .query_formats = amovie_query_formats,
 
-    .inputs    = (AVFilterPad[]) {{ .name = NULL }},
-    .outputs   = (AVFilterPad[]) {{ .name            = "default",
+    .inputs    = (const AVFilterPad[]) {{ .name = NULL }},
+    .outputs   = (const AVFilterPad[]) {{ .name      = "default",
                                     .type            = AVMEDIA_TYPE_AUDIO,
                                     .request_frame   = amovie_request_frame,
                                     .config_props    = amovie_config_output_props, },