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 */
54
65
70
71 return 0;
72 }
73
75 {
76 for (; p < end - 3; p += 4) {
78
79 if (x & (~(x+0x01010101)) & 0x80808080) {
80 if (p[0] == 0xff) {
81 return p;
82 } else if (p[1] == 0xff) {
83 return p+1;
84 } else if (p[2] == 0xff) {
85 return p+2;
86 } else if (p[3] == 0xff) {
87 return p+3;
88 }
89 }
90 }
91
92 for (; p < end; ++p) {
93 if (*p == 0xff) return p;
94 }
95
96 return end;
97 }
98
100 {
103 unsigned int soi_pos;
106
107 /* reallocate internal buffer */
108 if (current_pos > current_pos + cache_size)
112 current_pos + cache_size +
119
120 /* get data */
125
127
129 }
130
132 {
135 uint8_t *startmarker_ptr, *end, *search_end, marker;
137
140 /* update internal buffer */
144 }
146
147 /* find start marker - 0xff */
151 } else {
152 search_end = end;
154 if (startmarker_ptr >= search_end - 1 ||
155 *(startmarker_ptr + 1) !=
EOI)
break;
156 }
157
158 if (startmarker_ptr != search_end) { /* start marker found */
159 marker = *(startmarker_ptr + 1);
162
164 mxg->
soi_ptr = startmarker_ptr;
165 }
else if (marker ==
EOI) {
168 continue;
169 }
170
176
179
183 }
184
186 }
188
190 }
else if ( (
SOF0 <= marker && marker <=
SOF15) ||
191 (
SOS <= marker && marker <=
COM) ) {
192 /* all other markers that start marker segment also contain
193 length value (see specification for JPEG Annex B.1) */
197
204 } else {
206 }
207
209
210 if (marker ==
APP13 &&
size >= 16) {
/* audio data */
214 memcpy(
pkt->
data, startmarker_ptr + 16,
size - 14);
215
216 /* time (GMT) of first sample in usec since 1970, little-endian */
219
223 }
225 }
226
228 }
else if (marker ==
COM &&
size >= 18 &&
229 !strncmp(startmarker_ptr + 4, "MXF", 3)) {
230 /* time (GMT) of video frame in usec since 1970, little-endian */
232 }
233 }
234 } else {
235 /* start marker not found */
238 }
239 }
240
242 }
243
245 {
248 return 0;
249 }
250
258 .extensions = "mxg",
259 };