Commit 9abe4a10 authored by Stefano Sabatini's avatar Stefano Sabatini

examples/muxing: reuse global audio frame

Simplify logic, avoid multiple unnecessary alloc/free operations.
parent 80bca6ea
...@@ -123,6 +123,7 @@ static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec, ...@@ -123,6 +123,7 @@ static AVStream *add_stream(AVFormatContext *oc, AVCodec **codec,
static float t, tincr, tincr2; static float t, tincr, tincr2;
AVFrame *audio_frame;
static uint8_t **src_samples_data; static uint8_t **src_samples_data;
static int src_samples_linesize; static int src_samples_linesize;
static int src_nb_samples; static int src_nb_samples;
...@@ -141,6 +142,13 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st) ...@@ -141,6 +142,13 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, AVStream *st)
c = st->codec; c = st->codec;
/* allocate and init a re-usable frame */
audio_frame = av_frame_alloc();
if (!audio_frame) {
fprintf(stderr, "Could not allocate audio frame\n");
exit(1);
}
/* open it */ /* open it */
ret = avcodec_open2(c, codec, NULL); ret = avcodec_open2(c, codec, NULL);
if (ret < 0) { if (ret < 0) {
...@@ -225,7 +233,6 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st) ...@@ -225,7 +233,6 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st)
{ {
AVCodecContext *c; AVCodecContext *c;
AVPacket pkt = { 0 }; // data and size must be 0; AVPacket pkt = { 0 }; // data and size must be 0;
AVFrame *frame = av_frame_alloc();
int got_packet, ret, dst_nb_samples; int got_packet, ret, dst_nb_samples;
av_init_packet(&pkt); av_init_packet(&pkt);
...@@ -261,18 +268,18 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st) ...@@ -261,18 +268,18 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st)
dst_nb_samples = src_nb_samples; dst_nb_samples = src_nb_samples;
} }
frame->nb_samples = dst_nb_samples; audio_frame->nb_samples = dst_nb_samples;
avcodec_fill_audio_frame(frame, c->channels, c->sample_fmt, avcodec_fill_audio_frame(audio_frame, c->channels, c->sample_fmt,
dst_samples_data[0], dst_samples_size, 0); dst_samples_data[0], dst_samples_size, 0);
ret = avcodec_encode_audio2(c, &pkt, frame, &got_packet); ret = avcodec_encode_audio2(c, &pkt, audio_frame, &got_packet);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "Error encoding audio frame: %s\n", av_err2str(ret)); fprintf(stderr, "Error encoding audio frame: %s\n", av_err2str(ret));
exit(1); exit(1);
} }
if (!got_packet) if (!got_packet)
goto freeframe; return;
pkt.stream_index = st->index; pkt.stream_index = st->index;
...@@ -283,8 +290,6 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st) ...@@ -283,8 +290,6 @@ static void write_audio_frame(AVFormatContext *oc, AVStream *st)
av_err2str(ret)); av_err2str(ret));
exit(1); exit(1);
} }
freeframe:
av_frame_free(&frame);
} }
static void close_audio(AVFormatContext *oc, AVStream *st) static void close_audio(AVFormatContext *oc, AVStream *st)
...@@ -296,6 +301,7 @@ static void close_audio(AVFormatContext *oc, AVStream *st) ...@@ -296,6 +301,7 @@ static void close_audio(AVFormatContext *oc, AVStream *st)
} }
av_free(src_samples_data[0]); av_free(src_samples_data[0]);
av_free(src_samples_data); av_free(src_samples_data);
av_frame_free(&audio_frame);
} }
/**************************************************************/ /**************************************************************/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment