comparison matroskadec.c @ 2771:d52c718e83f9 libavformat

Use dynamically allocated ByteIOContext in AVFormatContext patch by: Bj«Órn Axelsson, bjorn d axelsson a intinor d se thread: [PATCH] Remove static ByteIOContexts, 06 nov 2007
author andoma
date Wed, 21 Nov 2007 07:41:00 +0000
parents 7efaa7166cb1
children c89e331851f3
comparison
equal deleted inserted replaced
2770:a7e42cf4b364 2771:d52c718e83f9
174 */ 174 */
175 175
176 static int 176 static int
177 ebml_read_element_level_up (MatroskaDemuxContext *matroska) 177 ebml_read_element_level_up (MatroskaDemuxContext *matroska)
178 { 178 {
179 ByteIOContext *pb = &matroska->ctx->pb; 179 ByteIOContext *pb = matroska->ctx->pb;
180 offset_t pos = url_ftell(pb); 180 offset_t pos = url_ftell(pb);
181 int num = 0; 181 int num = 0;
182 182
183 while (matroska->num_levels > 0) { 183 while (matroska->num_levels > 0) {
184 MatroskaLevel *level = &matroska->levels[matroska->num_levels - 1]; 184 MatroskaLevel *level = &matroska->levels[matroska->num_levels - 1];
206 static int 206 static int
207 ebml_read_num (MatroskaDemuxContext *matroska, 207 ebml_read_num (MatroskaDemuxContext *matroska,
208 int max_size, 208 int max_size,
209 uint64_t *number) 209 uint64_t *number)
210 { 210 {
211 ByteIOContext *pb = &matroska->ctx->pb; 211 ByteIOContext *pb = matroska->ctx->pb;
212 int len_mask = 0x80, read = 1, n = 1; 212 int len_mask = 0x80, read = 1, n = 1;
213 int64_t total = 0; 213 int64_t total = 0;
214 214
215 /* the first byte tells us the length in bytes - get_byte() can normally 215 /* the first byte tells us the length in bytes - get_byte() can normally
216 * return 0, but since that's not a valid first ebmlID byte, we can 216 * return 0, but since that's not a valid first ebmlID byte, we can
323 323
324 static int 324 static int
325 ebml_read_seek (MatroskaDemuxContext *matroska, 325 ebml_read_seek (MatroskaDemuxContext *matroska,
326 offset_t offset) 326 offset_t offset)
327 { 327 {
328 ByteIOContext *pb = &matroska->ctx->pb; 328 ByteIOContext *pb = matroska->ctx->pb;
329 329
330 /* clear ID cache, if any */ 330 /* clear ID cache, if any */
331 matroska->peek_id = 0; 331 matroska->peek_id = 0;
332 332
333 return (url_fseek(pb, offset, SEEK_SET) == offset) ? 0 : -1; 333 return (url_fseek(pb, offset, SEEK_SET) == offset) ? 0 : -1;
339 */ 339 */
340 340
341 static int 341 static int
342 ebml_read_skip (MatroskaDemuxContext *matroska) 342 ebml_read_skip (MatroskaDemuxContext *matroska)
343 { 343 {
344 ByteIOContext *pb = &matroska->ctx->pb; 344 ByteIOContext *pb = matroska->ctx->pb;
345 uint32_t id; 345 uint32_t id;
346 uint64_t length; 346 uint64_t length;
347 int res; 347 int res;
348 348
349 if ((res = ebml_read_element_id(matroska, &id, NULL)) < 0 || 349 if ((res = ebml_read_element_id(matroska, &id, NULL)) < 0 ||
363 static int 363 static int
364 ebml_read_uint (MatroskaDemuxContext *matroska, 364 ebml_read_uint (MatroskaDemuxContext *matroska,
365 uint32_t *id, 365 uint32_t *id,
366 uint64_t *num) 366 uint64_t *num)
367 { 367 {
368 ByteIOContext *pb = &matroska->ctx->pb; 368 ByteIOContext *pb = matroska->ctx->pb;
369 int n = 0, size, res; 369 int n = 0, size, res;
370 uint64_t rlength; 370 uint64_t rlength;
371 371
372 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 || 372 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
373 (res = ebml_read_element_length(matroska, &rlength)) < 0) 373 (res = ebml_read_element_length(matroska, &rlength)) < 0)
397 static int 397 static int
398 ebml_read_sint (MatroskaDemuxContext *matroska, 398 ebml_read_sint (MatroskaDemuxContext *matroska,
399 uint32_t *id, 399 uint32_t *id,
400 int64_t *num) 400 int64_t *num)
401 { 401 {
402 ByteIOContext *pb = &matroska->ctx->pb; 402 ByteIOContext *pb = matroska->ctx->pb;
403 int size, n = 1, negative = 0, res; 403 int size, n = 1, negative = 0, res;
404 uint64_t rlength; 404 uint64_t rlength;
405 405
406 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 || 406 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
407 (res = ebml_read_element_length(matroska, &rlength)) < 0) 407 (res = ebml_read_element_length(matroska, &rlength)) < 0)
436 static int 436 static int
437 ebml_read_float (MatroskaDemuxContext *matroska, 437 ebml_read_float (MatroskaDemuxContext *matroska,
438 uint32_t *id, 438 uint32_t *id,
439 double *num) 439 double *num)
440 { 440 {
441 ByteIOContext *pb = &matroska->ctx->pb; 441 ByteIOContext *pb = matroska->ctx->pb;
442 int size, res; 442 int size, res;
443 uint64_t rlength; 443 uint64_t rlength;
444 444
445 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 || 445 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
446 (res = ebml_read_element_length(matroska, &rlength)) < 0) 446 (res = ebml_read_element_length(matroska, &rlength)) < 0)
470 static int 470 static int
471 ebml_read_ascii (MatroskaDemuxContext *matroska, 471 ebml_read_ascii (MatroskaDemuxContext *matroska,
472 uint32_t *id, 472 uint32_t *id,
473 char **str) 473 char **str)
474 { 474 {
475 ByteIOContext *pb = &matroska->ctx->pb; 475 ByteIOContext *pb = matroska->ctx->pb;
476 int size, res; 476 int size, res;
477 uint64_t rlength; 477 uint64_t rlength;
478 478
479 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 || 479 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
480 (res = ebml_read_element_length(matroska, &rlength)) < 0) 480 (res = ebml_read_element_length(matroska, &rlength)) < 0)
532 532
533 static int 533 static int
534 ebml_read_master (MatroskaDemuxContext *matroska, 534 ebml_read_master (MatroskaDemuxContext *matroska,
535 uint32_t *id) 535 uint32_t *id)
536 { 536 {
537 ByteIOContext *pb = &matroska->ctx->pb; 537 ByteIOContext *pb = matroska->ctx->pb;
538 uint64_t length; 538 uint64_t length;
539 MatroskaLevel *level; 539 MatroskaLevel *level;
540 int res; 540 int res;
541 541
542 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 || 542 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
567 ebml_read_binary (MatroskaDemuxContext *matroska, 567 ebml_read_binary (MatroskaDemuxContext *matroska,
568 uint32_t *id, 568 uint32_t *id,
569 uint8_t **binary, 569 uint8_t **binary,
570 int *size) 570 int *size)
571 { 571 {
572 ByteIOContext *pb = &matroska->ctx->pb; 572 ByteIOContext *pb = matroska->ctx->pb;
573 uint64_t rlength; 573 uint64_t rlength;
574 int res; 574 int res;
575 575
576 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 || 576 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
577 (res = ebml_read_element_length(matroska, &rlength)) < 0) 577 (res = ebml_read_element_length(matroska, &rlength)) < 0)
1746 uint64_t length; 1746 uint64_t length;
1747 MatroskaLevel level; 1747 MatroskaLevel level;
1748 1748
1749 /* remember the peeked ID and the current position */ 1749 /* remember the peeked ID and the current position */
1750 peek_id_cache = matroska->peek_id; 1750 peek_id_cache = matroska->peek_id;
1751 before_pos = url_ftell(&matroska->ctx->pb); 1751 before_pos = url_ftell(matroska->ctx->pb);
1752 1752
1753 /* seek */ 1753 /* seek */
1754 if ((res = ebml_read_seek(matroska, seek_pos + 1754 if ((res = ebml_read_seek(matroska, seek_pos +
1755 matroska->segment_start)) < 0) 1755 matroska->segment_start)) < 0)
1756 return res; 1756 return res;
1786 if ((res = ebml_read_master(matroska, &id)) < 0) 1786 if ((res = ebml_read_master(matroska, &id)) < 0)
1787 goto finish; 1787 goto finish;
1788 switch (id) { 1788 switch (id) {
1789 case MATROSKA_ID_CUES: 1789 case MATROSKA_ID_CUES:
1790 if (!(res = matroska_parse_index(matroska)) || 1790 if (!(res = matroska_parse_index(matroska)) ||
1791 url_feof(&matroska->ctx->pb)) { 1791 url_feof(matroska->ctx->pb)) {
1792 matroska->index_parsed = 1; 1792 matroska->index_parsed = 1;
1793 res = 0; 1793 res = 0;
1794 } 1794 }
1795 break; 1795 break;
1796 case MATROSKA_ID_TAGS: 1796 case MATROSKA_ID_TAGS:
1797 if (!(res = matroska_parse_metadata(matroska)) || 1797 if (!(res = matroska_parse_metadata(matroska)) ||
1798 url_feof(&matroska->ctx->pb)) { 1798 url_feof(matroska->ctx->pb)) {
1799 matroska->metadata_parsed = 1; 1799 matroska->metadata_parsed = 1;
1800 res = 0; 1800 res = 0;
1801 } 1801 }
1802 break; 1802 break;
1803 } 1803 }
1929 /* We now have a Matroska segment. 1929 /* We now have a Matroska segment.
1930 * Seeks are from the beginning of the segment, 1930 * Seeks are from the beginning of the segment,
1931 * after the segment ID/length. */ 1931 * after the segment ID/length. */
1932 if ((res = ebml_read_master(matroska, &id)) < 0) 1932 if ((res = ebml_read_master(matroska, &id)) < 0)
1933 return res; 1933 return res;
1934 matroska->segment_start = url_ftell(&s->pb); 1934 matroska->segment_start = url_ftell(s->pb);
1935 1935
1936 matroska->time_scale = 1000000; 1936 matroska->time_scale = 1000000;
1937 /* we've found our segment, start reading the different contents in here */ 1937 /* we've found our segment, start reading the different contents in here */
1938 while (res == 0) { 1938 while (res == 0) {
1939 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { 1939 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
2483 switch (id) { 2483 switch (id) {
2484 /* one block inside the group. Note, block parsing is one 2484 /* one block inside the group. Note, block parsing is one
2485 * of the harder things, so this code is a bit complicated. 2485 * of the harder things, so this code is a bit complicated.
2486 * See http://www.matroska.org/ for documentation. */ 2486 * See http://www.matroska.org/ for documentation. */
2487 case MATROSKA_ID_BLOCK: { 2487 case MATROSKA_ID_BLOCK: {
2488 pos = url_ftell(&matroska->ctx->pb); 2488 pos = url_ftell(matroska->ctx->pb);
2489 res = ebml_read_binary(matroska, &id, &data, &size); 2489 res = ebml_read_binary(matroska, &id, &data, &size);
2490 break; 2490 break;
2491 } 2491 }
2492 2492
2493 case MATROSKA_ID_BLOCKDURATION: { 2493 case MATROSKA_ID_BLOCKDURATION: {
2545 uint8_t *data; 2545 uint8_t *data;
2546 int64_t pos; 2546 int64_t pos;
2547 int size; 2547 int size;
2548 2548
2549 av_log(matroska->ctx, AV_LOG_DEBUG, 2549 av_log(matroska->ctx, AV_LOG_DEBUG,
2550 "parsing cluster at %"PRId64"\n", url_ftell(&matroska->ctx->pb)); 2550 "parsing cluster at %"PRId64"\n", url_ftell(matroska->ctx->pb));
2551 2551
2552 while (res == 0) { 2552 while (res == 0) {
2553 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { 2553 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
2554 res = AVERROR(EIO); 2554 res = AVERROR(EIO);
2555 break; 2555 break;
2574 break; 2574 break;
2575 res = matroska_parse_blockgroup(matroska, cluster_time); 2575 res = matroska_parse_blockgroup(matroska, cluster_time);
2576 break; 2576 break;
2577 2577
2578 case MATROSKA_ID_SIMPLEBLOCK: 2578 case MATROSKA_ID_SIMPLEBLOCK:
2579 pos = url_ftell(&matroska->ctx->pb); 2579 pos = url_ftell(matroska->ctx->pb);
2580 res = ebml_read_binary(matroska, &id, &data, &size); 2580 res = ebml_read_binary(matroska, &id, &data, &size);
2581 if (res == 0) 2581 if (res == 0)
2582 res = matroska_parse_block(matroska, data, size, pos, 2582 res = matroska_parse_block(matroska, data, size, pos,
2583 cluster_time, AV_NOPTS_VALUE, 2583 cluster_time, AV_NOPTS_VALUE,
2584 -1, 0); 2584 -1, 0);
2666 index = av_index_search_timestamp(st, timestamp, flags); 2666 index = av_index_search_timestamp(st, timestamp, flags);
2667 if (index < 0) 2667 if (index < 0)
2668 return 0; 2668 return 0;
2669 2669
2670 /* do the seek */ 2670 /* do the seek */
2671 url_fseek(&s->pb, st->index_entries[index].pos, SEEK_SET); 2671 url_fseek(s->pb, st->index_entries[index].pos, SEEK_SET);
2672 matroska->skip_to_keyframe = !(flags & AVSEEK_FLAG_ANY); 2672 matroska->skip_to_keyframe = !(flags & AVSEEK_FLAG_ANY);
2673 matroska->skip_to_stream = st; 2673 matroska->skip_to_stream = st;
2674 matroska->num_packets = 0; 2674 matroska->num_packets = 0;
2675 matroska->peek_id = 0; 2675 matroska->peek_id = 0;
2676 return 0; 2676 return 0;