72 crc =
av_crc(crc_table, crc, tagbuf, 4);
75 crc =
av_crc(crc_table, crc, buf, length);
90 "APNG muxer supports only a single video APNG stream.\n");
98 "Last frame delay is too precise. Reducing to %d/%d (%f).\n",
122 int side_data_size = 0;
128 if (side_data_size) {
141 av_log(format_context,
AV_LOG_INFO,
"Only a single frame so saving as a normal PNG.\n");
145 if (existing_acTL_chunk) {
146 uint8_t *chunk_after_acTL = existing_acTL_chunk +
AV_RB32(existing_acTL_chunk) + 12;
155 if (existing_fcTL_chunk) {
156 uint8_t *chunk_after_fcTL = existing_fcTL_chunk +
AV_RB32(existing_fcTL_chunk) + 12;
172 if (!existing_acTL_chunk) {
183 if (existing_fcTL_chunk) {
186 existing_fcTL_chunk += 8;
187 delay.
num =
AV_RB16(existing_fcTL_chunk + 20);
188 delay.
den =
AV_RB16(existing_fcTL_chunk + 22);
190 if (delay.
num == 0 && delay.
den == 0) {
194 if (!
av_reduce(&delay.
num, &delay.
den, delay_num_raw, delay_den_raw, USHRT_MAX) &&
197 "Frame rate is too high or specified too precisely. Unable to copy losslessly.\n");
275 #define OFFSET(x) offsetof(APNGMuxContext, x)
276 #define ENC AV_OPT_FLAG_ENCODING_PARAM
278 {
"plays",
"Number of times to play the output: 0 - infinite loop, 1 - no loop",
OFFSET(plays),
280 {
"final_delay",
"Force delay after the last frame",
OFFSET(last_delay),
295 .mime_type =
"image/png",
296 .extensions =
"apng",
303 .priv_class = &apng_muxer_class,
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
void avio_wb64(AVIOContext *s, uint64_t val)
static int apng_write_trailer(AVFormatContext *format_context)
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
static const AVClass apng_muxer_class
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
This struct describes the properties of an encoded stream.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
AVStream ** streams
A list of all streams in the file.
Public header for CRC hash function implementation.
static int flush_packet(AVFormatContext *format_context, AVPacket *packet)
static void apng_write_chunk(AVIOContext *io_context, uint32_t tag, uint8_t *buf, size_t length)
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, int *size)
Get side information from packet.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
AVOutputFormat ff_apng_muxer
enum AVMediaType codec_type
General type of the encoded data.
simple assert() macros that are a bit more flexible than ISO C assert().
int extradata_size
Size of the extradata content in bytes.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
static int write_trailer(AVFormatContext *s1)
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
static uint8_t * apng_find_chunk(uint32_t tag, uint8_t *buf, size_t length)
#define AVIO_SEEKABLE_NORMAL
Seeking works like for a local file.
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
#define AV_LOG_INFO
Standard information.
AVIOContext * pb
I/O context.
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
int av_copy_packet(AVPacket *dst, const AVPacket *src)
Copy packet, including contents.
Describe the class of an AVClass context structure.
static const AVOption options[]
Rational number (pair of numerator and denominator).
static int apng_write_packet(AVFormatContext *format_context, AVPacket *packet)
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
#define MKBETAG(a, b, c, d)
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
void * priv_data
Format private data.
static void write_header(FFV1Context *f)
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
void avio_wb32(AVIOContext *s, unsigned int val)
AVCodecParameters * codecpar
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
This structure stores compressed data.
static int apng_write_header(AVFormatContext *format_context)