lavf/swfenc: switch to new FIFO API

release/5.1
Anton Khirnov 3 years ago committed by Andreas Rheinhardt
parent ea511196a6
commit 5fe2c37734
  1. 22
      libavformat/swfenc.c

@ -38,7 +38,7 @@ typedef struct SWFEncContext {
int swf_frame_number; int swf_frame_number;
int video_frame_number; int video_frame_number;
int tag; int tag;
AVFifoBuffer *audio_fifo; AVFifo *audio_fifo;
AVCodecParameters *audio_par, *video_par; AVCodecParameters *audio_par, *video_par;
AVStream *video_st; AVStream *video_st;
} SWFEncContext; } SWFEncContext;
@ -211,7 +211,7 @@ static int swf_write_header(AVFormatContext *s)
} }
if (par->codec_id == AV_CODEC_ID_MP3) { if (par->codec_id == AV_CODEC_ID_MP3) {
swf->audio_par = par; swf->audio_par = par;
swf->audio_fifo= av_fifo_alloc(AUDIO_FIFO_SIZE); swf->audio_fifo = av_fifo_alloc2(AUDIO_FIFO_SIZE, 1, 0);
if (!swf->audio_fifo) if (!swf->audio_fifo)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} else { } else {
@ -362,6 +362,12 @@ static int swf_write_header(AVFormatContext *s)
return 0; return 0;
} }
static int fifo_avio_wrapper(void *opaque, void *buf, size_t *nb_elems)
{
avio_write(opaque, buf, *nb_elems);
return 0;
}
static int swf_write_video(AVFormatContext *s, static int swf_write_video(AVFormatContext *s,
AVCodecParameters *par, const uint8_t *buf, int size, unsigned pkt_flags) AVCodecParameters *par, const uint8_t *buf, int size, unsigned pkt_flags)
{ {
@ -454,12 +460,12 @@ static int swf_write_video(AVFormatContext *s,
swf->swf_frame_number++; swf->swf_frame_number++;
/* streaming sound always should be placed just before showframe tags */ /* streaming sound always should be placed just before showframe tags */
if (swf->audio_par && av_fifo_size(swf->audio_fifo)) { if (swf->audio_par && av_fifo_can_read(swf->audio_fifo)) {
int frame_size = av_fifo_size(swf->audio_fifo); size_t frame_size = av_fifo_can_read(swf->audio_fifo);
put_swf_tag(s, TAG_STREAMBLOCK | TAG_LONG); put_swf_tag(s, TAG_STREAMBLOCK | TAG_LONG);
avio_wl16(pb, swf->sound_samples); avio_wl16(pb, swf->sound_samples);
avio_wl16(pb, 0); // seek samples avio_wl16(pb, 0); // seek samples
av_fifo_generic_read(swf->audio_fifo, pb, frame_size, (void*)avio_write); av_fifo_read_to_cb(swf->audio_fifo, fifo_avio_wrapper, pb, &frame_size);
put_swf_end_tag(s); put_swf_end_tag(s);
/* update FIFO */ /* update FIFO */
@ -482,12 +488,12 @@ static int swf_write_audio(AVFormatContext *s,
if (swf->swf_frame_number == 16000) if (swf->swf_frame_number == 16000)
av_log(s, AV_LOG_INFO, "warning: Flash Player limit of 16000 frames reached\n"); av_log(s, AV_LOG_INFO, "warning: Flash Player limit of 16000 frames reached\n");
if (av_fifo_size(swf->audio_fifo) + size > AUDIO_FIFO_SIZE) { if (av_fifo_can_write(swf->audio_fifo) < size) {
av_log(s, AV_LOG_ERROR, "audio fifo too small to mux audio essence\n"); av_log(s, AV_LOG_ERROR, "audio fifo too small to mux audio essence\n");
return -1; return -1;
} }
av_fifo_generic_write(swf->audio_fifo, buf, size, NULL); av_fifo_write(swf->audio_fifo, buf, size);
swf->sound_samples += av_get_audio_frame_duration2(par, size); swf->sound_samples += av_get_audio_frame_duration2(par, size);
/* if audio only stream make sure we add swf frames */ /* if audio only stream make sure we add swf frames */
@ -535,7 +541,7 @@ static void swf_deinit(AVFormatContext *s)
{ {
SWFEncContext *swf = s->priv_data; SWFEncContext *swf = s->priv_data;
av_fifo_freep(&swf->audio_fifo); av_fifo_freep2(&swf->audio_fifo);
} }
#if CONFIG_SWF_MUXER #if CONFIG_SWF_MUXER

Loading…
Cancel
Save