1 /*
2 * AVI demuxer
3 * Copyright (c) 2001 Fabrice Bellard
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
35
37 int64_t
frame_offset;
/* current frame (video) or byte (audio) counter
38 * (used to compute the pts) */
41
45 * (in the rate/scale sense) in bytes */
46
47 int64_t
cum_len;
/* temporary storage (used during seek) */
48 int prefix;
/* normally 'd'<<8 + 'c' or 'w'<<8 + 'b' */
53 * the MS dshow demuxer */
54
58
61
77 #define MAX_ODML_DEPTH 1000
80
81
84 { NULL },
85 };
86
93 };
94
95
97 { 'R', 'I', 'F', 'F', 'A', 'V', 'I', ' ' },
98 { 'R', 'I', 'F', 'F', 'A', 'V', 'I', 'X' },
99 { 'R', 'I', 'F', 'F', 'A', 'V', 'I', 0x19 },
100 { 'O', 'N', '2', ' ', 'O', 'N', '2', 'f' },
101 { 'R', 'I', 'F', 'F', 'A', 'M', 'V', ' ' },
102 { 0 }
103 };
104
106 { "strn", "title" },
107 { 0 },
108 };
109
112
113 #define print_tag(str, tag, size) \
114 av_dlog(NULL, "%s: tag=%c%c%c%c size=0x%x\n", \
115 str, tag & 0xff, \
116 (tag >> 8) & 0xff, \
117 (tag >> 16) & 0xff, \
118 (tag >> 24) & 0xff, \
119 size)
120
122 {
127 else
128 return 1;
129 }
130
132 {
134 char header[8];
135 int i;
136
137 /* check RIFF header */
142
145 break;
148
149 if (header[7] == 0x19)
151 "This file has been generated by a totally broken muxer.\n");
152
153 return 0;
154 }
155
157 {
161 int index_sub_type =
avio_r8(pb);
166 int stream_id = ((chunk_id & 0xFF) - '0') * 10 +
167 ((chunk_id >> 8 & 0xFF) - '0');
170 int i;
171 int64_t last_pos = -1;
172 int64_t filesize = avi->
fsize;
173
175 "longs_pre_entry:%d index_type:%d entries_in_use:%d "
176 "chunk_id:%X base:%16"PRIX64"\n",
177 longs_pre_entry,
178 index_type,
179 entries_in_use,
180 chunk_id,
181 base);
182
183 if (stream_id >= s->
nb_streams || stream_id < 0)
187
188 if (index_sub_type)
190
192
193 if (index_type && longs_pre_entry != 2)
195 if (index_type > 1)
197
198 if (filesize > 0 && base >= filesize) {
200 if (base >> 32 == (base & 0xFFFFFFFF) &&
201 (base & 0xFFFFFFFF) < filesize &&
202 filesize <= 0xFFFFFFFF)
203 base &= 0xFFFFFFFF;
204 else
206 }
207
208 for (i = 0; i < entries_in_use; i++) {
209 if (index_type) {
212 int key = len >= 0;
213 len &= 0x7FFFFFFF;
214
215 #ifdef DEBUG_SEEK
217 #endif
220
221 if (last_pos == pos || pos == base - 8)
226
228 last_pos = pos;
229 } else {
235
238
240
244 }
245
246 if (
avio_seek(pb, offset + 8, SEEK_SET) < 0)
247 return -1;
252
255 return -1;
256 }
257
258 }
259 }
261 return 0;
262 }
263
265 {
266 int i;
267 int64_t j;
268
274 int64_t pos,
size, ts;
275
277 continue;
278
279 while (max < 1024)
280 max += max;
281
285
286 for (j = 0; j <
size; j += max)
289 }
290 }
291
294 {
296 char key[5] = { 0 };
298
299 size += (size & 1);
300
301 if (size == UINT_MAX)
304 if (!value)
308
310
313 }
314
315 static const char months[12][4] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
316 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
317
319 {
320 char month[4], time[9],
buffer[64];
321 int i, day, year;
322 /* parse standard AVI date format (ie. "Mon Mar 10 15:04:43 2003") */
323 if (sscanf(date, "%*3s%*[ ]%3s%*[ ]%2d%*[ ]%8s%*[ ]%4d",
324 month, &day, time, &year) == 4) {
325 for (i = 0; i < 12; i++)
327 snprintf(buffer,
sizeof(buffer),
"%.4d-%.2d-%.2d %s",
328 year, i + 1, day, time);
330 }
331 } else if (date[4] == '/' && date[7] == '/') {
332 date[4] = date[7] = '-';
334 }
335 }
336
338 {
342 switch (tag) {
343 case MKTAG(
'n',
'c',
't',
'g'):
/* Nikon Tags */
344 {
349 const char *
name = NULL;
353 FFMIN(size,
sizeof(buffer) - 1));
354 switch (tag) {
355 case 0x03:
356 name = "maker";
357 break;
358 case 0x04:
359 name = "model";
360 break;
361 case 0x13:
362 name = "creation_time";
363 if (buffer[4] == ':' && buffer[7] == ':')
364 buffer[4] = buffer[7] = '-';
365 break;
366 }
367 if (name)
370 }
371 break;
372 }
373 default:
375 break;
376 }
377 }
378 }
379
381 {
387 int i;
390 int avih_width = 0, avih_height = 0;
391 int amv_file_format = 0;
392 uint64_t list_end = 0;
395
397
399 if (ret < 0)
401
403
407
408 /* first list tag */
409 stream_index = -1;
410 codec_type = -1;
411 frame_period = 0;
412 for (;;) {
414 goto fail;
417
419
420 switch (tag) {
421 case MKTAG(
'L',
'I',
'S',
'T'):
423 /* Ignored, except at start of video packets. */
425
427
428 if (tag1 ==
MKTAG(
'm',
'o',
'v',
'i')) {
430 if (size)
432 else
435 goto end_of_header;
436 }
else if (tag1 ==
MKTAG(
'I',
'N',
'F',
'O'))
438 else if (tag1 ==
MKTAG(
'n',
'c',
'd',
't'))
440
441 break;
442 case MKTAG(
'I',
'D',
'I',
'T'):
443 {
444 unsigned char date[64] = { 0 };
445 size += (size & 1);
449 break;
450 }
451 case MKTAG(
'd',
'm',
'l',
'h'):
454 break;
455 case MKTAG(
'a',
'm',
'v',
'h'):
456 amv_file_format = 1;
457 case MKTAG(
'a',
'v',
'i',
'h'):
458 /* AVI header */
459 /* using frame_period is bad idea */
461 avio_rl32(pb);
/* max. bytes per second */
464
470
472 break;
473 case MKTAG(
's',
't',
'r',
'h'):
474 /* stream header */
475
478
479 if (tag1 ==
MKTAG(
'p',
'a',
'd',
's')) {
481 break;
482 } else {
483 stream_index++;
485 if (!st)
486 goto fail;
487
488 st->
id = stream_index;
490 if (!ast)
491 goto fail;
493 }
494 if (amv_file_format)
495 tag1 = stream_index ?
MKTAG(
'a',
'u',
'd',
's')
496 :
MKTAG(
'v',
'i',
'd',
's');
497
499
500 if (tag1 ==
MKTAG(
'i',
'a',
'v',
's') ||
501 tag1 ==
MKTAG(
'i',
'v',
'a',
's')) {
502 int64_t dv_dur;
503
504 /* After some consideration -- I don't think we
505 * have to support anything but DV in type1 AVIs. */
507 goto fail;
508
509 if (handler !=
MKTAG(
'd',
'v',
's',
'd') &&
510 handler !=
MKTAG(
'd',
'v',
'h',
'd') &&
511 handler !=
MKTAG(
'd',
'v',
's',
'l'))
512 goto fail;
513
522 if (CONFIG_DV_DEMUXER) {
525 goto fail;
526 } else
527 goto fail;
533
535 if (ast->
scale > 0 && ast->
rate > 0 && dv_dur > 0) {
538 }
539 /* else, leave duration alone; timing estimation in utils.c
540 * will make a guess based on bitrate. */
541
544 break;
545 }
546
549
558 "scale/rate is %u/%u which is invalid. "
559 "(This file has been generated by broken software.)\n",
562 if (frame_period) {
564 ast->
scale = frame_period;
565 } else {
568 }
569 }
571
574
581 }
584 av_dlog(s,
"%"PRIu32
" %"PRIu32
" %d\n",
586
587 switch (tag1) {
588 case MKTAG(
'v',
'i',
'd',
's'):
590
592 break;
593 case MKTAG(
'a',
'u',
'd',
's'):
595 break;
596 case MKTAG(
't',
'x',
't',
's'):
598 break;
599 case MKTAG(
'd',
'a',
't',
's'):
601 break;
602 default:
604 }
610 }
611 }
614 break;
615 case MKTAG(
's',
't',
'r',
'f'):
616 /* stream header */
617 if (!size)
618 break;
621 } else {
623 unsigned esize;
624 if (cur_pos < list_end)
625 size =
FFMIN(size, list_end - cur_pos);
627 switch (codec_type) {
629 if (amv_file_format) {
635 break;
636 }
638
639 if (tag1 ==
MKTAG(
'D',
'X',
'S',
'B') ||
640 tag1 ==
MKTAG(
'D',
'X',
'S',
'A')) {
644 break;
645 }
646
647 if (size > 10 * 4 && size < (1 << 30) && size < avi->fsize) {
648 if (esize == size-1 && (esize&1)) {
650 } else
657 }
658
659 // FIXME: check if the encoder really did this correctly
662
663 /* Extract palette from extradata if bpp <= 8.
664 * This code assumes that extradata contains only palette.
665 * This is true for all paletted codecs implemented in
666 * FFmpeg. */
671
675 for (i = 0; i < pal_size / 4; i++)
676 ast->
pal[i] = 0xFFU<<24 |
AV_RL32(pal_src+4*i);
678 }
679
681
685 tag1);
686 /* This is needed to get the pict type which is necessary
687 * for generating correct pts. */
691
700 } else
702 "BottomUp", 9);
703 }
705
706 // avio_skip(pb, size - 5 * 4);
707 break;
710 if (ret < 0)
717 "sample size (%d) != block align (%d)\n",
721 }
722 /* 2-aligned
723 * (fix for Stargate SG-1 - 3x18 - Shades of Grey.avi) */
724 if (size & 1)
726 /* Force parsing as several audio frames can be in
727 * one packet and timestamps refer to packet start. */
729 /* ADTS header is in extradata, AAC without header must be
730 * stored as exact frames. Parser not needed and it will
731 * fail. */
735 /* AVI files with Xan DPCM audio (wrongly) declare PCM
736 * audio in the header but have Axan as stream_code_tag. */
741 }
742 if (amv_file_format) {
745 }
749 }
755 }
756 break;
761 break;
762 default:
767 break;
768 }
769 }
770 break;
771 case MKTAG(
's',
't',
'r',
'd'):
776 } else {
778 if (cur_pos < list_end)
779 size =
FFMIN(size, list_end - cur_pos);
781
782 if (size<(1<<30)) {
786 }
787
790 }
791 break;
792 case MKTAG(
'i',
'n',
'd',
'x'):
798 goto fail;
800 break;
801 case MKTAG(
'v',
'p',
'r',
'p'):
802 if (stream_index < (
unsigned)s->
nb_streams && size > 9 * 4) {
804
811
817
818 if (active_aspect.
num && active_aspect.
den &&
819 active.
num && active.
den) {
821 av_dlog(s,
"vprp %d/%d %d/%d\n",
822 active_aspect.
num, active_aspect.
den,
824 }
825 size -= 9 * 4;
826 }
828 break;
829 case MKTAG(
's',
't',
'r',
'n'):
832 if (ret < 0)
834 break;
835 }
836 default:
837 if (size > 1000000) {
839 "Something went wrong during header parsing, "
840 "I will ignore it and try to continue anyway.\n");
842 goto fail;
845 goto end_of_header;
846 }
847 /* skip tag */
848 size += (size & 1);
850 break;
851 }
852 }
853
854 end_of_header:
855 /* check stream number */
857
858 fail:
860 }
861
866
868 if (dict_entry && !strcmp(dict_entry->
value,
"PotEncoder"))
874 }
875
879 break;
880 }
881 // DV-in-AVI cannot be non-interleaved, if set this must be
882 // a mis-detection.
887 "Non-interleaved AVI without index, switching to interleaved\n");
889 }
890
894 }
895
898
899 return 0;
900 }
901
903 {
904 if (pkt->
size >= 7 &&
913 0, NULL, NULL, NULL, NULL);
916
918 goto error;
919
922 if (*desc)
924
927
931 goto error;
932
934 goto error;
935
943 }
945 memset(pkt, 0, sizeof(*pkt));
946 return 1;
947
948 error:
950 }
951 return 0;
952 }
953
956 {
958 int64_t ts, next_ts, ts_min = INT64_MAX;
960 int i;
961
964
970 if (ts <= next_ts && ts < ts_min) {
971 ts_min = ts;
972 sub_st = st;
973 }
974 }
975 }
976
977 if (sub_st) {
981
984 }
985 return sub_st;
986 }
987
989 {
990 if (d[0] >= '0' && d[0] <= '9' &&
991 d[1] >= '0' && d[1] <= '9') {
992 return (d[0] - '0') * 10 + (d[1] - '0');
993 } else {
994 return 100; // invalid stream ID
995 }
996 }
997
998 /**
999 *
1000 * @param exit_early set to 1 to just gather packet position without making the changes needed to actually read & return the packet
1001 */
1003 {
1007 unsigned int d[8];
1010
1011 start_sync:
1012 memset(d, -1, sizeof(d));
1014 int j;
1015
1016 for (j = 0; j < 7; j++)
1017 d[j] = d[j + 1];
1019
1020 size = d[4] + (d[5] << 8) + (d[6] << 16) + (d[7] << 24);
1021
1023 av_dlog(s,
"%X %X %X %X %X %X %X %X %"PRId64
" %u %d\n",
1024 d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], i, size, n);
1025 if (i*(avi->
io_fsize>0) + (uint64_t)size > avi->
fsize || d[0] > 127)
1026 continue;
1027
1028 // parse ix##
1029 if ((d[0] == 'i' && d[1] == 'x' && n < s->nb_streams) ||
1030 // parse JUNK
1031 (d[0] == 'J' && d[1] == 'U' && d[2] == 'N' && d[3] == 'K') ||
1032 (d[0] == 'i' && d[1] == 'd' && d[2] == 'x' && d[3] == '1')) {
1034 goto start_sync;
1035 }
1036
1037 // parse stray LIST
1038 if (d[0] == 'L' && d[1] == 'I' && d[2] == 'S' && d[3] == 'T') {
1040 goto start_sync;
1041 }
1042
1044
1047 continue;
1048
1049 // detect ##ix chunk and skip
1050 if (d[2] == 'i' && d[3] == 'x' && n < s->nb_streams) {
1052 goto start_sync;
1053 }
1054
1055 // parse ##dc/##wb
1056 if (n < s->nb_streams) {
1061
1062 if (!ast) {
1064 continue;
1065 }
1066
1070 // workaround for broken small-file-bug402.avi
1071 if ( d[2] == 'w' && d[3] == 'b'
1072 && n == 0
1075 && ast->
prefix ==
'd'*256+
'c'
1077 ) {
1078 n = 1;
1079 st = st1;
1080 ast = ast1;
1082 "Invalid stream + prefix combination, assuming audio.\n");
1083 }
1084 }
1085
1088 // FIXME: needs a little reordering
1089 (st->discard >= AVDISCARD_NONKEY &&
1090 !(pkt->flags & AV_PKT_FLAG_KEY)) */
1092 if (!exit_early) {
1095 goto start_sync;
1096 }
1097 }
1098
1099 if (d[2] == 'p' && d[3] == 'c' && size <= 4 * 256 + 4) {
1101 int last = (k +
avio_r8(pb) - 1) & 0xFF;
1102
1104
1105 // b + (g << 8) + (r << 16);
1106 for (; k <= last; k++)
1108
1110 goto start_sync;
1112 d[2] < 128 && d[3] < 128) ||
1113 d[2] * 256 + d[3] == ast->
prefix /* ||
1114 (d[2] == 'd' && d[3] == 'c') ||
1115 (d[2] == 'w' && d[3] == 'b') */) {
1116 if (exit_early)
1117 return 0;
1118 if (d[2] * 256 + d[3] == ast->
prefix)
1120 else {
1121 ast->
prefix = d[2] * 256 + d[3];
1123 }
1124
1128
1135 }
1136 }
1137 return 0;
1138 }
1139 }
1140 }
1141
1145 }
1146
1148 {
1151 int err;
1152 #if FF_API_DESTRUCT_PACKET
1153 void *dstr;
1154 #endif
1155
1156 if (CONFIG_DV_DEMUXER && avi->
dv_demux) {
1158 if (size >= 0)
1160 else
1162 }
1163
1165 int best_stream_index = 0;
1168 int64_t best_ts = INT64_MAX;
1169 int i;
1170
1175 int64_t last_ts;
1176
1178 continue;
1179
1182 continue;
1183
1187
1188 av_dlog(s,
"%"PRId64
" %d/%d %"PRId64
"\n", ts,
1189 st->time_base.num, st->time_base.den, ast->frame_offset);
1190 if (ts < best_ts) {
1191 best_ts = ts;
1192 best_st = st;
1193 best_stream_index = i;
1194 }
1195 }
1196 if (!best_st)
1198
1199 best_ast = best_st->priv_data;
1200 best_ts = best_ast->frame_offset;
1201 if (best_ast->remaining) {
1203 best_ts,
1206 } else {
1208 if (i >= 0)
1209 best_ast->frame_offset = best_st->index_entries[i].timestamp;
1210 }
1211
1212 if (i >= 0) {
1213 int64_t pos = best_st->index_entries[i].pos;
1214 pos += best_ast->packet_size - best_ast->remaining;
1217
1218 av_assert0(best_ast->remaining <= best_ast->packet_size);
1219
1221 if (!best_ast->remaining)
1222 best_ast->packet_size =
1223 best_ast->remaining = best_st->index_entries[i].size;
1224 }
1225 else
1227 }
1228
1230 if (avi->stream_index >= 0) {
1231 AVStream *st =
s->streams[avi->stream_index];
1234
1236 return 0;
1237
1238 // minorityreport.AVI block_align=1024 sample_size=1 IMA-ADPCM
1240 size = INT_MAX;
1242 // arbitrary multiplier to avoid tiny packets for raw PCM data
1244 else
1246
1251 if (err < 0)
1252 return err;
1253 size = err;
1254
1260 if (!pal) {
1262 "Failed to allocate data for palette\n");
1263 } else {
1266 }
1267 }
1268
1269 if (CONFIG_DV_DEMUXER && avi->dv_demux) {
1271 #if FF_API_DESTRUCT_PACKET
1273 dstr =
pkt->destruct;
1275 #endif
1278 #if FF_API_DESTRUCT_PACKET
1280 pkt->destruct = dstr;
1282 #endif
1285 if (size < 0)
1290 avi->stream_index = -1;
1293 } else {
1294 /* XXX: How to handle B-frames in AVI? */
1296 // pkt->dts += ast->start;
1300 "dts:%"PRId64" offset:%"PRId64" %d/%d smpl_siz:%d "
1301 "base:%d st:%d size:%d\n",
1308 avi->stream_index,
1309 size);
1311
1315
1318
1321 int key=1;
1322 int i;
1324 for (i=0; i<
FFMIN(size,256); i++) {
1326 if (state == 0x1B6) {
1328 break;
1329 }
1330 }else
1331 break;
1332 state= (state<<8) +
pkt->
data[i];
1333 }
1334 if (!key)
1336 }
1339 }
1340 } else {
1342 }
1344 }
1347 avi->stream_index = -1;
1349 }
1350
1354 }
1356
1357 if (!avi->non_interleaved && st->
nb_index_entries>1 && avi->index_loaded>1) {
1359
1361 avi->non_interleaved= 1;
1363 }else if (avi->dts_max < dts)
1364 avi->dts_max = dts;
1365 }
1366
1367 return 0;
1368 }
1369
1371 return err;
1373 }
1374
1375 /* XXX: We make the implicit supposition that the positions are sorted
1376 * for each stream. */
1378 {
1381 int nb_index_entries, i;
1385 unsigned last_pos = -1;
1386 unsigned last_idx = -1;
1387 int64_t idx1_pos, first_packet_pos = 0, data_offset = 0;
1388 int anykey = 0;
1389
1390 nb_index_entries = size / 16;
1391 if (nb_index_entries <= 0)
1393
1400
1402 first_packet_pos = 0;
1404 }
1405
1406 /* Read the entries and sort them in each stream component. */
1407 for (i = 0; i < nb_index_entries; i++) {
1409 return -1;
1410
1415 av_dlog(s,
"%d: tag=0x%x flags=0x%x pos=0x%x len=%d/",
1416 i, tag, flags, pos, len);
1417
1418 index = ((tag & 0xff) - '0') * 10;
1419 index += (tag >> 8 & 0xff) - '0';
1421 continue;
1424
1425 if (first_packet && first_packet_pos) {
1426 data_offset = first_packet_pos - pos;
1427 first_packet = 0;
1428 }
1429 pos += data_offset;
1430
1432
1433 // even if we have only a single stream, we should
1434 // switch to non-interleaved to get correct timestamps
1435 if (last_pos == pos)
1437 if (last_idx != pos && len) {
1440 last_idx= pos;
1441 }
1443 last_pos = pos;
1445 }
1446 if (!anykey) {
1447 for (index = 0; index < s->
nb_streams; index++) {
1451 }
1452 }
1453 return 0;
1454 }
1455
1457 {
1458 int i;
1459 int64_t last_start = 0;
1460 int64_t first_end = INT64_MAX;
1462 int *idx;
1463 int64_t min_pos, pos;
1464
1469
1470 if (n <= 0)
1471 continue;
1472
1473 if (n >= 2) {
1478 last_start = INT64_MAX;
1479 }
1480
1485 }
1487 if (last_start > first_end)
1488 return 1;
1490 if (!idx)
1491 return 0;
1492 for (min_pos=pos=0; min_pos!=INT64_MAX; pos= min_pos+1LU) {
1493 int64_t max_dts = INT64_MIN/2, min_dts= INT64_MAX/2;
1494 min_pos = INT64_MAX;
1495
1501 idx[i]++;
1502 if (idx[i] < n) {
1505 }
1506 if (idx[i])
1508 }
1511 return 1;
1512 }
1513 }
1515 return 0;
1516 }
1517
1519 {
1524 int64_t next;
1526
1528 goto the_end; // maybe truncated file
1530 for (;;) {
1534 break;
1535 next =
avio_tell(pb) + size + (size & 1);
1536
1537 av_dlog(s,
"tag=%c%c%c%c size=0x%x\n",
1538 tag & 0xff,
1539 (tag >> 8) & 0xff,
1540 (tag >> 16) & 0xff,
1541 (tag >> 24) & 0xff,
1542 size);
1543
1544 if (tag ==
MKTAG(
'i',
'd',
'x',
'1') &&
1547 ret = 0;
1548 }
else if (tag ==
MKTAG(
'L',
'I',
'S',
'T')) {
1550
1551 if (tag1 ==
MKTAG(
'I',
'N',
'F',
'O'))
1553 }else if (!ret)
1554 break;
1555
1557 break; // something is wrong here
1558 }
1559
1560 the_end:
1563 }
1564
1566 {
1573 }
1574
1576 int64_t timestamp,
int flags)
1577 {
1581 int64_t pos, pos_min;
1583
1584 /* Does not matter which stream is requested dv in avi has the
1585 * stream information in the first video stream.
1586 */
1588 stream_index = 0;
1589
1591 /* we only load the index on demand */
1594 }
1596
1597 st = s->
streams[stream_index];
1601 flags);
1602 if (index < 0) {
1604 av_log(s,
AV_LOG_DEBUG,
"Failed to find timestamp %"PRId64
" in index %"PRId64
" .. %"PRId64
"\n",
1609 }
1610
1611 /* find the position */
1614
1615 av_dlog(s,
"XX %"PRId64
" %d %"PRId64
"\n",
1617
1618 if (CONFIG_DV_DEMUXER && avi->
dv_demux) {
1619 /* One and only one real stream for DV in AVI, and it has video */
1620 /* offsets. Calling with other stream indexes should have failed */
1621 /* the av_index_search_timestamp call above. */
1622
1624 return -1;
1625
1626 /* Feed the DV video stream version of the timestamp to the */
1627 /* DV demux so it can synthesize correct timestamps. */
1629
1631 return 0;
1632 }
1633
1634 pos_min = pos;
1638
1641
1644 continue;
1645 }
1646
1648 continue;
1649
1650 // av_assert1(st2->codec->block_align);
1658 flags |
1661 if (index < 0)
1662 index = 0;
1665 }
1669
1671 continue;
1672
1674 st2,
1677 if (index < 0)
1678 index = 0;
1680 index--;
1682 }
1683
1684 /* do the seek */
1687 return -1;
1688 }
1691 return 0;
1692 }
1693
1695 {
1696 int i;
1698
1702 if (ast) {
1706 }
1709 }
1710 }
1711
1713
1714 return 0;
1715 }
1716
1718 {
1719 int i;
1720
1721 /* check file header */
1726
1727 return 0;
1728 }
1729
1739 .priv_class = &demuxer_class,
1740 };