FFmpeg  4.4.6
mods.c
Go to the documentation of this file.
1 /*
2  * MODS demuxer
3  * Copyright (c) 2015-2016 Florian Nouwt
4  * Copyright (c) 2017 Adib Surani
5  * Copyright (c) 2020 Paul B Mahol
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #include "libavutil/intreadwrite.h"
25 
26 #include "avformat.h"
27 #include "internal.h"
28 
29 static int mods_probe(const AVProbeData *p)
30 {
31  if (memcmp(p->buf, "MODSN3\x0a\x00", 8))
32  return 0;
33  if (AV_RB32(p->buf + 8) == 0)
34  return 0;
35  if (AV_RB32(p->buf + 12) == 0)
36  return 0;
37  if (AV_RB32(p->buf + 16) == 0)
38  return 0;
39  return AVPROBE_SCORE_MAX;
40 }
41 
43 {
44  AVIOContext *pb = s->pb;
45  AVRational fps;
46  int64_t pos;
47 
49  if (!st)
50  return AVERROR(ENOMEM);
51 
52  avio_skip(pb, 8);
53 
54  st->nb_frames = avio_rl32(pb);
57  st->codecpar->width = avio_rl32(pb);
58  st->codecpar->height = avio_rl32(pb);
59 
60  fps.num = avio_rl32(pb);
61  fps.den = 0x1000000;
62  avpriv_set_pts_info(st, 64, fps.den, fps.num);
63 
64  avio_skip(pb, 16);
65 
66  pos = avio_rl32(pb) + 4;
67  avio_seek(pb, pos, SEEK_SET);
68  pos = avio_rl32(pb);
69  avio_seek(pb, pos, SEEK_SET);
70 
71  return 0;
72 }
73 
75 {
76  AVIOContext *pb = s->pb;
77  unsigned size;
78  int64_t pos;
79  int ret;
80 
81  if (avio_feof(pb))
82  return AVERROR_EOF;
83 
84  pos = avio_tell(pb);
85  size = avio_rl32(pb) >> 14;
86  ret = av_get_packet(pb, pkt, size);
87  pkt->pos = pos;
88  pkt->stream_index = 0;
90 
91  return ret;
92 }
93 
95  .name = "mods",
96  .long_name = NULL_IF_CONFIG_SMALL("MobiClip MODS"),
97  .read_probe = mods_probe,
98  .read_header = mods_read_header,
99  .read_packet = mods_read_packet,
100  .extensions = "mods",
101  .flags = AVFMT_GENERIC_INDEX,
102 };
Main libavformat public API header.
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:453
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:310
#define AVFMT_GENERIC_INDEX
Use generic index building code.
Definition: avformat.h:463
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:253
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:364
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:557
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:337
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:750
#define AV_RB32
Definition: intreadwrite.h:130
#define s(width, name)
Definition: cbs_vp9.c:257
#define NULL
Definition: coverity.c:32
long long int64_t
Definition: coverity.c:34
@ AV_CODEC_ID_MOBICLIP
Definition: codec_id.h:303
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:410
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:4509
#define AVERROR_EOF
End of file.
Definition: error.h:55
#define AVERROR(e)
Definition: error.h:43
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: utils.c:4945
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
static int mods_probe(const AVProbeData *p)
Definition: mods.c:29
AVInputFormat ff_mods_demuxer
Definition: mods.c:94
static int mods_read_header(AVFormatContext *s)
Definition: mods.c:42
static int mods_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: mods.c:74
unsigned int pos
Definition: spdifenc.c:412
int width
Video only.
Definition: codec_par.h:126
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:56
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:60
Format I/O context.
Definition: avformat.h:1232
Bytestream IO Context.
Definition: avio.h:161
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:645
This structure stores compressed data.
Definition: packet.h:346
int stream_index
Definition: packet.h:371
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:375
int64_t pos
byte position in stream, -1 if unknown
Definition: packet.h:389
This structure contains the data a format has to probe a file.
Definition: avformat.h:441
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:443
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:873
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1038
int64_t nb_frames
number of frames in this stream if known or 0
Definition: avformat.h:924
AVPacket * pkt
Definition: movenc.c:59
int size