FFmpeg
Loading...
Searching...
No Matches
ivfdec.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2010 David Conrad
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include "avformat.h"
22#include "demux.h"
23#include "internal.h"
24#include "riff.h"
26
27static int probe(const AVProbeData *p)
28{
29 if (AV_RL32(p->buf) == MKTAG('D','K','I','F')
30 && !AV_RL16(p->buf+4) && AV_RL16(p->buf+6) == 32)
31 return AVPROBE_SCORE_MAX-2;
32
33 return 0;
34}
35
37{
38 AVStream *st;
39 AVRational time_base;
40
41 avio_rl32(s->pb); // DKIF
42 avio_rl16(s->pb); // version
43 avio_rl16(s->pb); // header size
44
46 if (!st)
47 return AVERROR(ENOMEM);
48
49
51 st->codecpar->codec_tag = avio_rl32(s->pb);
53 st->codecpar->width = avio_rl16(s->pb);
54 st->codecpar->height = avio_rl16(s->pb);
55 time_base.den = avio_rl32(s->pb);
56 time_base.num = avio_rl32(s->pb);
57 st->nb_frames = avio_rl32(s->pb);
58 avio_skip(s->pb, 4); // unused
59
60 // Infer duration from nb_frames, in order to be backward compatible with
61 // previous IVF demuxer.
62 // It is popular to configure time_base to 1/frame_rate by IVF muxer, that
63 // the duration happens to be the same with nb_frames. See
64 // `https://chromium.googlesource.com/webm/vp8-test-vectors/+/refs/heads/main`
65 st->duration = st->nb_frames;
66
68
69 if (!time_base.den || !time_base.num) {
70 av_log(s, AV_LOG_ERROR, "Invalid frame rate\n");
72 }
73
74 avpriv_set_pts_info(st, 64, time_base.num, time_base.den);
75
76 return 0;
77}
78
80{
81 int ret, size = avio_rl32(s->pb);
82 int64_t pts = avio_rl64(s->pb);
83
84 ret = av_get_packet(s->pb, pkt, size);
85 pkt->stream_index = 0;
86 pkt->pts = pts;
87 pkt->pos -= 12;
88
89 return ret;
90}
91
93 .p.name = "ivf",
94 .p.long_name = NULL_IF_CONFIG_SMALL("On2 IVF"),
95 .p.flags = AVFMT_GENERIC_INDEX,
96 .p.codec_tag = (const AVCodecTag* const []){ ff_codec_bmp_tags, 0 },
97 .read_probe = probe,
98 .read_header = read_header,
99 .read_packet = read_packet,
100};
static int probe(const AVProbeData *p)
Definition act.c:39
const FFInputFormat ff_ivf_demuxer
Definition ivfdec.c:92
void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition avformat.c:834
Main libavformat public API header.
#define AVPROBE_SCORE_MAX
maximum score
Definition avformat.h:485
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
Definition utils.c:98
#define AVFMT_GENERIC_INDEX
Use generic index building code.
Definition avformat.h:501
@ AVSTREAM_PARSE_HEADERS
Only parse headers, do not repack.
Definition avformat.h:614
unsigned int avio_rl16(AVIOContext *s)
Definition aviobuf.c:717
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition aviobuf.c:321
unsigned int avio_rl32(AVIOContext *s)
Definition aviobuf.c:733
uint64_t avio_rl64(AVIOContext *s)
Definition aviobuf.c:741
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
#define s(width, name)
Definition cbs_vp9.c:198
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static AVPacket * pkt
static int read_header(FFV1Context *f, RangeCoder *c)
Definition ffv1dec.c:578
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define AV_RL32(p)
#define AV_RL16(p)
static int read_packet(AVFormatContext *s, AVPacket *pkt)
Definition ivfdec.c:79
static int read_header(AVFormatContext *s)
Definition ivfdec.c:36
static int probe(const AVProbeData *p)
Definition ivfdec.c:27
static av_always_inline FFStream * ffstream(AVStream *st)
Definition internal.h:365
enum AVCodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag)
Definition utils.c:143
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
#define MKTAG(a, b, c, d)
Definition macros.h:55
const AVCodecTag ff_codec_bmp_tags[]
Definition riff.c:36
internal header for RIFF based (de)muxers do NOT include this in end user applications
int height
The height of the video frame in pixels.
Definition codec_par.h:150
int width
The width of the video frame in pixels.
Definition codec_par.h:143
enum AVMediaType codec_type
General type of the encoded data.
Definition codec_par.h:53
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition codec_par.h:61
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition codec_par.h:57
Format I/O context.
Definition avformat.h:1335
This structure stores compressed data.
Definition packet.h:580
This structure contains the data a format has to probe a file.
Definition avformat.h:473
Rational number (pair of numerator and denominator).
Definition rational.h:58
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
Stream structure.
Definition avformat.h:768
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition avformat.h:791
int64_t nb_frames
number of frames in this stream if known or 0
Definition avformat.h:829
int64_t duration
Decoding: duration of the stream, in stream time base.
Definition avformat.h:827
enum AVStreamParseType need_parsing
Definition internal.h:321
#define av_log(a,...)
static int64_t pts
int size