1 /*
2 * MxPEG clip file demuxer
3 * Copyright (c) 2010 Anatoly Nenashev
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
29
30 #define DEFAULT_PACKET_SIZE 1024
31 #define OVERREAD_SIZE 3
32
41
43 {
46
47 /* video parameters will be extracted from the compressed bitstream */
49 if (!video_st)
54
56 if (!audio_st)
66
71
72 return 0;
73 }
74
76 {
77 for (; p < end - 3; p += 4) {
79
80 if (x & (~(x+0x01010101)) & 0x80808080) {
81 if (p[0] == 0xff) {
82 return p;
83 } else if (p[1] == 0xff) {
84 return p+1;
85 } else if (p[2] == 0xff) {
86 return p+2;
87 } else if (p[3] == 0xff) {
88 return p+3;
89 }
90 }
91 }
92
93 for (; p <
end; ++p) {
94 if (*p == 0xff) return p;
95 }
96
98 }
99
101 {
104 unsigned int soi_pos;
106 int ret;
107
108 /* reallocate internal buffer */
109 if (current_pos > current_pos + cache_size)
113 current_pos + cache_size +
115 if (!buffer)
120
121 /* get data */
124 if (ret < 0)
125 return ret;
126
128
129 return ret;
130 }
131
133 {
134 int ret;
136 uint8_t *startmarker_ptr, *
end, *search_end, marker;
138
141 /* update internal buffer */
143 if (ret < 0)
144 return ret;
145 }
147
148 /* find start marker - 0xff */
152 } else {
155 if (startmarker_ptr >= search_end - 1 ||
156 *(startmarker_ptr + 1) !=
EOI)
break;
157 }
158
159 if (startmarker_ptr != search_end) { /* start marker found */
160 marker = *(startmarker_ptr + 1);
163
165 mxg->
soi_ptr = startmarker_ptr;
166 }
else if (marker ==
EOI) {
169 continue;
170 }
171
177
181 }
182
184 }
186
188 }
else if ( (
SOF0 <= marker && marker <=
SOF15) ||
189 (
SOS <= marker && marker <=
COM) ) {
190 /* all other markers that start marker segment also contain
191 length value (see specification for JPEG Annex B.1) */
193 if (size < 2)
195
198 if (ret < 0)
199 return ret;
202 } else {
204 }
205
207
208 if (marker ==
APP13 && size >= 16) {
/* audio data */
209 /* time (GMT) of first sample in usec since 1970, little-endian */
213 pkt->
size = size - 14;
214 pkt->
data = startmarker_ptr + 16;
215
219 }
221 }
222
224 }
else if (marker ==
COM && size >= 18 &&
225 !strncmp(startmarker_ptr + 4, "MXF", 3)) {
226 /* time (GMT) of video frame in usec since 1970, little-endian */
228 }
229 }
230 } else {
231 /* start marker not found */
234 }
235 }
236
238 }
239
241 {
244 return 0;
245 }
246
254 .extensions = "mxg",
255 };
#define AV_LOG_WARNING
Something somehow does not look correct.
static uint8_t * mxg_find_startmarker(uint8_t *p, uint8_t *end)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
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
MJPEG encoder and decoder.
static av_cold int end(AVCodecContext *avctx)
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
#define AVERROR_EOF
End of file.
static av_cold int read_close(AVFormatContext *ctx)
uint64_t channel_layout
Audio only.
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
enum AVMediaType codec_type
General type of the encoded data.
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
static int mxg_read_packet(AVFormatContext *s, AVPacket *pkt)
common internal API header
int block_align
Audio only.
audio channel layout utility functions
#define DEFAULT_PACKET_SIZE
AVInputFormat ff_mxg_demuxer
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
static int mxg_update_cache(AVFormatContext *s, unsigned int cache_size)
static int read_header(FFV1Context *f)
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
AVIOContext * pb
I/O context.
int error
contains the error code or 0 if no error happened
int sample_rate
Audio only.
static int mxg_close(struct AVFormatContext *s)
#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.
int bits_per_coded_sample
The number of bits per sample in the codedwords.
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
AVCodecParameters * codecpar
int avio_feof(AVIOContext *s)
feof() equivalent for AVIOContext.
#define AV_CH_LAYOUT_MONO
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define AV_NOPTS_VALUE
Undefined timestamp value.
static int mxg_read_header(AVFormatContext *s)