avformat/swf: Separate mux and demux contexts

There was almost no overlap between them: The only field used by both
was an int named samples_per_frame. Therefore this commit separates
them.

Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
Andreas Rheinhardt 2020-09-20 13:21:28 +02:00
parent bc0e776c9a
commit 913aa4204a
3 changed files with 43 additions and 47 deletions

View File

@ -23,15 +23,6 @@
#ifndef AVFORMAT_SWF_H #ifndef AVFORMAT_SWF_H
#define AVFORMAT_SWF_H #define AVFORMAT_SWF_H
#include "config.h"
#if CONFIG_ZLIB
#include <zlib.h>
#endif
#include "libavutil/fifo.h"
#include "avformat.h"
#include "avio.h"
#include "internal.h" #include "internal.h"
/* should have a generic way to indicate probable size */ /* should have a generic way to indicate probable size */
@ -113,35 +104,11 @@ enum {
#define FLAG_SETFILL0 0x02 #define FLAG_SETFILL0 0x02
#define FLAG_SETFILL1 0x04 #define FLAG_SETFILL1 0x04
#define AUDIO_FIFO_SIZE 65536
/* character id used */ /* character id used */
#define BITMAP_ID 0 #define BITMAP_ID 0
#define VIDEO_ID 0 #define VIDEO_ID 0
#define SHAPE_ID 1 #define SHAPE_ID 1
typedef struct SWFContext {
int64_t duration_pos;
int64_t tag_pos;
int64_t vframes_pos;
int samples_per_frame;
int sound_samples;
int swf_frame_number;
int video_frame_number;
int frame_rate;
int tag;
AVFifoBuffer *audio_fifo;
AVCodecParameters *audio_par, *video_par;
AVStream *video_st;
#if CONFIG_ZLIB
#define ZBUF_SIZE 4096
AVIOContext *zpb;
uint8_t *zbuf_in;
uint8_t *zbuf_out;
z_stream zstream;
#endif
} SWFContext;
extern const AVCodecTag ff_swf_codec_tags[]; extern const AVCodecTag ff_swf_codec_tags[];
#endif /* AVFORMAT_SWF_H */ #endif /* AVFORMAT_SWF_H */

View File

@ -34,6 +34,18 @@
#include "libavcodec/get_bits.h" #include "libavcodec/get_bits.h"
#include "swf.h" #include "swf.h"
typedef struct SWFDecContext {
int samples_per_frame;
int frame_rate;
#if CONFIG_ZLIB
#define ZBUF_SIZE 4096
AVIOContext *zpb;
uint8_t *zbuf_in;
uint8_t *zbuf_out;
z_stream zstream;
#endif
} SWFDecContext;
static const AVCodecTag swf_audio_codec_tags[] = { static const AVCodecTag swf_audio_codec_tags[] = {
{ AV_CODEC_ID_PCM_S16LE, 0x00 }, { AV_CODEC_ID_PCM_S16LE, 0x00 },
{ AV_CODEC_ID_ADPCM_SWF, 0x01 }, { AV_CODEC_ID_ADPCM_SWF, 0x01 },
@ -101,7 +113,7 @@ static int swf_probe(const AVProbeData *p)
static int zlib_refill(void *opaque, uint8_t *buf, int buf_size) static int zlib_refill(void *opaque, uint8_t *buf, int buf_size)
{ {
AVFormatContext *s = opaque; AVFormatContext *s = opaque;
SWFContext *swf = s->priv_data; SWFDecContext *swf = s->priv_data;
z_stream *z = &swf->zstream; z_stream *z = &swf->zstream;
int ret; int ret;
@ -132,7 +144,7 @@ retry:
static int swf_read_header(AVFormatContext *s) static int swf_read_header(AVFormatContext *s)
{ {
SWFContext *swf = s->priv_data; SWFDecContext *swf = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
int nbits, len, tag; int nbits, len, tag;
@ -202,7 +214,7 @@ static AVStream *create_new_audio_stream(AVFormatContext *s, int id, int info)
static int swf_read_packet(AVFormatContext *s, AVPacket *pkt) static int swf_read_packet(AVFormatContext *s, AVPacket *pkt)
{ {
SWFContext *swf = s->priv_data; SWFDecContext *swf = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
AVStream *vst = NULL, *ast = NULL, *st = 0; AVStream *vst = NULL, *ast = NULL, *st = 0;
int tag, len, i, frame, v, res; int tag, len, i, frame, v, res;
@ -525,7 +537,7 @@ bitmap_end_skip:
#if CONFIG_ZLIB #if CONFIG_ZLIB
static av_cold int swf_read_close(AVFormatContext *avctx) static av_cold int swf_read_close(AVFormatContext *avctx)
{ {
SWFContext *s = avctx->priv_data; SWFDecContext *s = avctx->priv_data;
inflateEnd(&s->zstream); inflateEnd(&s->zstream);
av_freep(&s->zbuf_in); av_freep(&s->zbuf_in);
av_freep(&s->zbuf_out); av_freep(&s->zbuf_out);
@ -537,7 +549,7 @@ static av_cold int swf_read_close(AVFormatContext *avctx)
AVInputFormat ff_swf_demuxer = { AVInputFormat ff_swf_demuxer = {
.name = "swf", .name = "swf",
.long_name = NULL_IF_CONFIG_SMALL("SWF (ShockWave Flash)"), .long_name = NULL_IF_CONFIG_SMALL("SWF (ShockWave Flash)"),
.priv_data_size = sizeof(SWFContext), .priv_data_size = sizeof(SWFDecContext),
.read_probe = swf_probe, .read_probe = swf_probe,
.read_header = swf_read_header, .read_header = swf_read_header,
.read_packet = swf_read_packet, .read_packet = swf_read_packet,

View File

@ -22,12 +22,29 @@
#include "libavcodec/put_bits.h" #include "libavcodec/put_bits.h"
#include "libavutil/avassert.h" #include "libavutil/avassert.h"
#include "libavutil/fifo.h"
#include "avformat.h" #include "avformat.h"
#include "swf.h" #include "swf.h"
#define AUDIO_FIFO_SIZE 65536
typedef struct SWFEncContext {
int64_t duration_pos;
int64_t tag_pos;
int64_t vframes_pos;
int samples_per_frame;
int sound_samples;
int swf_frame_number;
int video_frame_number;
int tag;
AVFifoBuffer *audio_fifo;
AVCodecParameters *audio_par, *video_par;
AVStream *video_st;
} SWFEncContext;
static void put_swf_tag(AVFormatContext *s, int tag) static void put_swf_tag(AVFormatContext *s, int tag)
{ {
SWFContext *swf = s->priv_data; SWFEncContext *swf = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
swf->tag_pos = avio_tell(pb); swf->tag_pos = avio_tell(pb);
@ -43,7 +60,7 @@ static void put_swf_tag(AVFormatContext *s, int tag)
static void put_swf_end_tag(AVFormatContext *s) static void put_swf_end_tag(AVFormatContext *s)
{ {
SWFContext *swf = s->priv_data; SWFEncContext *swf = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
int64_t pos; int64_t pos;
int tag_len, tag; int tag_len, tag;
@ -173,7 +190,7 @@ static void put_swf_matrix(AVIOContext *pb,
static int swf_write_header(AVFormatContext *s) static int swf_write_header(AVFormatContext *s)
{ {
SWFContext *swf = s->priv_data; SWFEncContext *swf = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
PutBitContext p; PutBitContext p;
uint8_t buf1[256]; uint8_t buf1[256];
@ -343,7 +360,7 @@ static int swf_write_header(AVFormatContext *s)
static int swf_write_video(AVFormatContext *s, static int swf_write_video(AVFormatContext *s,
AVCodecParameters *par, const uint8_t *buf, int size) AVCodecParameters *par, const uint8_t *buf, int size)
{ {
SWFContext *swf = s->priv_data; SWFEncContext *swf = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
/* Flash Player limit */ /* Flash Player limit */
@ -448,7 +465,7 @@ static int swf_write_video(AVFormatContext *s,
static int swf_write_audio(AVFormatContext *s, static int swf_write_audio(AVFormatContext *s,
AVCodecParameters *par, uint8_t *buf, int size) AVCodecParameters *par, uint8_t *buf, int size)
{ {
SWFContext *swf = s->priv_data; SWFEncContext *swf = s->priv_data;
/* Flash Player limit */ /* Flash Player limit */
if (swf->swf_frame_number == 16000) if (swf->swf_frame_number == 16000)
@ -480,7 +497,7 @@ static int swf_write_packet(AVFormatContext *s, AVPacket *pkt)
static int swf_write_trailer(AVFormatContext *s) static int swf_write_trailer(AVFormatContext *s)
{ {
SWFContext *swf = s->priv_data; SWFEncContext *swf = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
int file_size; int file_size;
@ -505,7 +522,7 @@ static int swf_write_trailer(AVFormatContext *s)
static void swf_deinit(AVFormatContext *s) static void swf_deinit(AVFormatContext *s)
{ {
SWFContext *swf = s->priv_data; SWFEncContext *swf = s->priv_data;
av_fifo_freep(&swf->audio_fifo); av_fifo_freep(&swf->audio_fifo);
} }
@ -516,7 +533,7 @@ AVOutputFormat ff_swf_muxer = {
.long_name = NULL_IF_CONFIG_SMALL("SWF (ShockWave Flash)"), .long_name = NULL_IF_CONFIG_SMALL("SWF (ShockWave Flash)"),
.mime_type = "application/x-shockwave-flash", .mime_type = "application/x-shockwave-flash",
.extensions = "swf", .extensions = "swf",
.priv_data_size = sizeof(SWFContext), .priv_data_size = sizeof(SWFEncContext),
.audio_codec = AV_CODEC_ID_MP3, .audio_codec = AV_CODEC_ID_MP3,
.video_codec = AV_CODEC_ID_FLV1, .video_codec = AV_CODEC_ID_FLV1,
.write_header = swf_write_header, .write_header = swf_write_header,
@ -531,7 +548,7 @@ AVOutputFormat ff_avm2_muxer = {
.name = "avm2", .name = "avm2",
.long_name = NULL_IF_CONFIG_SMALL("SWF (ShockWave Flash) (AVM2)"), .long_name = NULL_IF_CONFIG_SMALL("SWF (ShockWave Flash) (AVM2)"),
.mime_type = "application/x-shockwave-flash", .mime_type = "application/x-shockwave-flash",
.priv_data_size = sizeof(SWFContext), .priv_data_size = sizeof(SWFEncContext),
.audio_codec = AV_CODEC_ID_MP3, .audio_codec = AV_CODEC_ID_MP3,
.video_codec = AV_CODEC_ID_FLV1, .video_codec = AV_CODEC_ID_FLV1,
.write_header = swf_write_header, .write_header = swf_write_header,