summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2016-07-24 19:06:00 +0200
committerwm4 <wm4@nowhere>2016-07-24 19:06:00 +0200
commit3623cec7d2753ec7e7bf1ca73580203acb3347c8 (patch)
tree2563ead45b6b86ae6889f76b3e9095da68703301 /audio
parentd60db967bda3e9910ec6bc78d0d0cb284f5d68fa (diff)
downloadmpv-3623cec7d2753ec7e7bf1ca73580203acb3347c8.tar.bz2
mpv-3623cec7d2753ec7e7bf1ca73580203acb3347c8.tar.xz
af_lavcac3enc: use common code for AVFrame setup
Diffstat (limited to 'audio')
-rw-r--r--audio/audio.c24
-rw-r--r--audio/audio.h1
-rw-r--r--audio/filter/af_lavcac3enc.c13
3 files changed, 22 insertions, 16 deletions
diff --git a/audio/audio.c b/audio/audio.c
index 306401b5a4..710cc03193 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -394,12 +394,9 @@ fail:
return NULL;
}
-// Returns NULL on failure. The input is always unreffed.
-struct AVFrame *mp_audio_to_avframe_and_unref(struct mp_audio *frame)
+int mp_audio_to_avframe(struct mp_audio *frame, struct AVFrame *avframe)
{
- struct AVFrame *avframe = av_frame_alloc();
- if (!avframe)
- goto fail;
+ av_frame_unref(avframe);
avframe->nb_samples = frame->samples;
avframe->format = af_to_avformat(frame->format);
@@ -457,6 +454,23 @@ struct AVFrame *mp_audio_to_avframe_and_unref(struct mp_audio *frame)
avframe = tmp;
}
+ return 0;
+
+fail:
+ av_frame_unref(avframe);
+ return -1;
+}
+
+// Returns NULL on failure. The input is always unreffed.
+struct AVFrame *mp_audio_to_avframe_and_unref(struct mp_audio *frame)
+{
+ struct AVFrame *avframe = av_frame_alloc();
+ if (!avframe)
+ goto fail;
+
+ if (mp_audio_to_avframe(frame, avframe) < 0)
+ goto fail;
+
talloc_free(frame);
return avframe;
diff --git a/audio/audio.h b/audio/audio.h
index e126e93b66..0f32f080b9 100644
--- a/audio/audio.h
+++ b/audio/audio.h
@@ -81,6 +81,7 @@ int mp_audio_make_writeable(struct mp_audio *data);
struct AVFrame;
struct mp_audio *mp_audio_from_avframe(struct AVFrame *avframe);
struct AVFrame *mp_audio_to_avframe_and_unref(struct mp_audio *frame);
+int mp_audio_to_avframe(struct mp_audio *frame, struct AVFrame *avframe);
struct mp_audio_pool;
struct mp_audio_pool *mp_audio_pool_create(void *ta_parent);
diff --git a/audio/filter/af_lavcac3enc.c b/audio/filter/af_lavcac3enc.c
index 26c9cbff58..31b84e1528 100644
--- a/audio/filter/af_lavcac3enc.c
+++ b/audio/filter/af_lavcac3enc.c
@@ -249,17 +249,8 @@ static int read_input_frame(struct af_instance *af, AVFrame *frame)
if (!fill_buffer(af))
return 0; // need more input
- frame->nb_samples = s->in_samples;
- frame->format = s->lavc_actx->sample_fmt;
- frame->channel_layout = s->lavc_actx->channel_layout;
-#if LIBAVUTIL_VERSION_MICRO >= 100
- frame->channels = s->lavc_actx->channels;
-#endif
- assert(s->input->num_planes <= AV_NUM_DATA_POINTERS);
- frame->extended_data = frame->data;
- for (int n = 0; n < s->input->num_planes; n++)
- frame->data[n] = s->input->planes[n];
- frame->linesize[0] = s->input->samples * s->input->sstride;
+ if (mp_audio_to_avframe(s->input, frame) < 0)
+ return -1;
return 1;
}