Mercurial > libavformat.hg
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; |