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;
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)
126
128
130 }
131
133 {
136 uint8_t *startmarker_ptr, *
end, *search_end, marker;
138
141 /* update internal buffer */
143 if (ret < 0)
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
174 #if FF_API_DESTRUCT_PACKET
178 #endif
182
186 }
187
189 }
191
193 }
else if ( (
SOF0 <= marker && marker <=
SOF15) ||
194 (
SOS <= marker && marker <=
COM) ) {
195 /* all other markers that start marker segment also contain
196 length value (see specification for JPEG Annex B.1) */
198 if (size < 2)
200
203 if (ret < 0)
207 } else {
209 }
210
212
213 if (marker ==
APP13 && size >= 16) {
/* audio data */
214 /* time (GMT) of first sample in usec since 1970, little-endian */
217 #if FF_API_DESTRUCT_PACKET
221 #endif
223 pkt->
size = size - 14;
224 pkt->
data = startmarker_ptr + 16;
225
229 }
231 }
232
234 }
else if (marker ==
COM && size >= 18 &&
235 !strncmp(startmarker_ptr + 4, "MXF", 3)) {
236 /* time (GMT) of video frame in usec since 1970, little-endian */
238 }
239 }
240 } else {
241 /* start marker not found */
244 }
245 }
246
248 }
249
251 {
254 return 0;
255 }
256
264 .extensions = "mxg",
265 };