00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00031 #include "avformat.h"
00032
00033 #include "riff.h"
00034 #include "intfloat_readwrite.h"
00035 #include "matroska.h"
00036
00037 typedef struct Track {
00038 MatroskaTrackType type;
00039
00040
00041
00042 uint32_t num;
00043 uint32_t uid;
00044 int stream_index;
00045
00046 char *name;
00047 char language[4];
00048
00049 char *codec_id;
00050 char *codec_name;
00051
00052 unsigned char *codec_priv;
00053 int codec_priv_size;
00054
00055 uint64_t default_duration;
00056 MatroskaTrackFlags flags;
00057 } MatroskaTrack;
00058
00059 typedef struct MatroskaVideoTrack {
00060 MatroskaTrack track;
00061
00062 int pixel_width;
00063 int pixel_height;
00064 int display_width;
00065 int display_height;
00066
00067 uint32_t fourcc;
00068
00069 MatroskaAspectRatioMode ar_mode;
00070 MatroskaEyeMode eye_mode;
00071
00072
00073 } MatroskaVideoTrack;
00074
00075 typedef struct MatroskaAudioTrack {
00076 MatroskaTrack track;
00077
00078 int channels;
00079 int bitdepth;
00080 int internal_samplerate;
00081 int samplerate;
00082 int block_align;
00083
00084
00085 int coded_framesize;
00086 int sub_packet_h;
00087 int frame_size;
00088 int sub_packet_size;
00089 int sub_packet_cnt;
00090 int pkt_cnt;
00091 uint8_t *buf;
00092
00093 } MatroskaAudioTrack;
00094
00095 typedef struct MatroskaSubtitleTrack {
00096 MatroskaTrack track;
00097
00098 int ass;
00099
00100 } MatroskaSubtitleTrack;
00101
00102 #define MAX_TRACK_SIZE (FFMAX(FFMAX(sizeof(MatroskaVideoTrack), \
00103 sizeof(MatroskaAudioTrack)), \
00104 sizeof(MatroskaSubtitleTrack)))
00105
00106 typedef struct MatroskaLevel {
00107 uint64_t start;
00108 uint64_t length;
00109 } MatroskaLevel;
00110
00111 typedef struct MatroskaDemuxIndex {
00112 uint64_t pos;
00113 uint16_t track;
00114 uint64_t time;
00115 } MatroskaDemuxIndex;
00116
00117 typedef struct MatroskaDemuxContext {
00118 AVFormatContext *ctx;
00119
00120
00121 int num_levels;
00122 MatroskaLevel levels[EBML_MAX_DEPTH];
00123 int level_up;
00124
00125
00126 char *writing_app;
00127 char *muxing_app;
00128 int64_t created;
00129
00130
00131 int64_t time_scale;
00132
00133
00134
00135 int num_tracks;
00136 int num_streams;
00137 MatroskaTrack *tracks[MAX_STREAMS];
00138
00139
00140 uint32_t peek_id;
00141
00142
00143 offset_t segment_start;
00144
00145
00146 AVPacket **packets;
00147 int num_packets;
00148
00149
00150 int metadata_parsed;
00151 int index_parsed;
00152 int done;
00153
00154
00155 int num_indexes;
00156 MatroskaDemuxIndex *index;
00157
00158
00159 int skip_to_keyframe;
00160 AVStream *skip_to_stream;
00161 } MatroskaDemuxContext;
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 static int
00177 ebml_read_element_level_up (MatroskaDemuxContext *matroska)
00178 {
00179 ByteIOContext *pb = &matroska->ctx->pb;
00180 offset_t pos = url_ftell(pb);
00181 int num = 0;
00182
00183 while (matroska->num_levels > 0) {
00184 MatroskaLevel *level = &matroska->levels[matroska->num_levels - 1];
00185
00186 if (pos >= level->start + level->length) {
00187 matroska->num_levels--;
00188 num++;
00189 } else {
00190 break;
00191 }
00192 }
00193
00194 return num;
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 static int
00207 ebml_read_num (MatroskaDemuxContext *matroska,
00208 int max_size,
00209 uint64_t *number)
00210 {
00211 ByteIOContext *pb = &matroska->ctx->pb;
00212 int len_mask = 0x80, read = 1, n = 1;
00213 int64_t total = 0;
00214
00215
00216
00217
00218 if (!(total = get_byte(pb))) {
00219
00220 if (!url_feof(pb)) {
00221 offset_t pos = url_ftell(pb);
00222 av_log(matroska->ctx, AV_LOG_ERROR,
00223 "Read error at pos. %"PRIu64" (0x%"PRIx64")\n",
00224 pos, pos);
00225 }
00226 return AVERROR(EIO);
00227 }
00228
00229
00230 while (read <= max_size && !(total & len_mask)) {
00231 read++;
00232 len_mask >>= 1;
00233 }
00234 if (read > max_size) {
00235 offset_t pos = url_ftell(pb) - 1;
00236 av_log(matroska->ctx, AV_LOG_ERROR,
00237 "Invalid EBML number size tag 0x%02x at pos %"PRIu64" (0x%"PRIx64")\n",
00238 (uint8_t) total, pos, pos);
00239 return AVERROR_INVALIDDATA;
00240 }
00241
00242
00243 total &= ~len_mask;
00244 while (n++ < read)
00245 total = (total << 8) | get_byte(pb);
00246
00247 *number = total;
00248
00249 return read;
00250 }
00251
00252
00253
00254
00255
00256
00257 static int
00258 ebml_read_element_id (MatroskaDemuxContext *matroska,
00259 uint32_t *id,
00260 int *level_up)
00261 {
00262 int read;
00263 uint64_t total;
00264
00265
00266 if (matroska->peek_id != 0) {
00267 if (level_up)
00268 *level_up = 0;
00269 *id = matroska->peek_id;
00270 return 0;
00271 }
00272
00273
00274 if ((read = ebml_read_num(matroska, 4, &total)) < 0)
00275 return read;
00276 *id = matroska->peek_id = total | (1 << (read * 7));
00277
00278
00279 if (level_up)
00280 *level_up = ebml_read_element_level_up(matroska);
00281
00282 return read;
00283 }
00284
00285
00286
00287
00288
00289
00290 static int
00291 ebml_read_element_length (MatroskaDemuxContext *matroska,
00292 uint64_t *length)
00293 {
00294
00295 matroska->peek_id = 0;
00296
00297
00298 return ebml_read_num(matroska, 8, length);
00299 }
00300
00301
00302
00303
00304
00305
00306
00307 static uint32_t
00308 ebml_peek_id (MatroskaDemuxContext *matroska,
00309 int *level_up)
00310 {
00311 uint32_t id;
00312
00313 if (ebml_read_element_id(matroska, &id, level_up) < 0)
00314 return 0;
00315
00316 return id;
00317 }
00318
00319
00320
00321
00322
00323
00324 static int
00325 ebml_read_seek (MatroskaDemuxContext *matroska,
00326 offset_t offset)
00327 {
00328 ByteIOContext *pb = &matroska->ctx->pb;
00329
00330
00331 matroska->peek_id = 0;
00332
00333 return (url_fseek(pb, offset, SEEK_SET) == offset) ? 0 : -1;
00334 }
00335
00336
00337
00338
00339
00340
00341 static int
00342 ebml_read_skip (MatroskaDemuxContext *matroska)
00343 {
00344 ByteIOContext *pb = &matroska->ctx->pb;
00345 uint32_t id;
00346 uint64_t length;
00347 int res;
00348
00349 if ((res = ebml_read_element_id(matroska, &id, NULL)) < 0 ||
00350 (res = ebml_read_element_length(matroska, &length)) < 0)
00351 return res;
00352
00353 url_fskip(pb, length);
00354
00355 return 0;
00356 }
00357
00358
00359
00360
00361
00362
00363 static int
00364 ebml_read_uint (MatroskaDemuxContext *matroska,
00365 uint32_t *id,
00366 uint64_t *num)
00367 {
00368 ByteIOContext *pb = &matroska->ctx->pb;
00369 int n = 0, size, res;
00370 uint64_t rlength;
00371
00372 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
00373 (res = ebml_read_element_length(matroska, &rlength)) < 0)
00374 return res;
00375 size = rlength;
00376 if (size < 1 || size > 8) {
00377 offset_t pos = url_ftell(pb);
00378 av_log(matroska->ctx, AV_LOG_ERROR,
00379 "Invalid uint element size %d at position %"PRId64" (0x%"PRIx64")\n",
00380 size, pos, pos);
00381 return AVERROR_INVALIDDATA;
00382 }
00383
00384
00385 *num = 0;
00386 while (n++ < size)
00387 *num = (*num << 8) | get_byte(pb);
00388
00389 return 0;
00390 }
00391
00392
00393
00394
00395
00396
00397 static int
00398 ebml_read_sint (MatroskaDemuxContext *matroska,
00399 uint32_t *id,
00400 int64_t *num)
00401 {
00402 ByteIOContext *pb = &matroska->ctx->pb;
00403 int size, n = 1, negative = 0, res;
00404 uint64_t rlength;
00405
00406 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
00407 (res = ebml_read_element_length(matroska, &rlength)) < 0)
00408 return res;
00409 size = rlength;
00410 if (size < 1 || size > 8) {
00411 offset_t pos = url_ftell(pb);
00412 av_log(matroska->ctx, AV_LOG_ERROR,
00413 "Invalid sint element size %d at position %"PRId64" (0x%"PRIx64")\n",
00414 size, pos, pos);
00415 return AVERROR_INVALIDDATA;
00416 }
00417 if ((*num = get_byte(pb)) & 0x80) {
00418 negative = 1;
00419 *num &= ~0x80;
00420 }
00421 while (n++ < size)
00422 *num = (*num << 8) | get_byte(pb);
00423
00424
00425 if (negative)
00426 *num = *num - (1LL << ((8 * size) - 1));
00427
00428 return 0;
00429 }
00430
00431
00432
00433
00434
00435
00436 static int
00437 ebml_read_float (MatroskaDemuxContext *matroska,
00438 uint32_t *id,
00439 double *num)
00440 {
00441 ByteIOContext *pb = &matroska->ctx->pb;
00442 int size, res;
00443 uint64_t rlength;
00444
00445 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
00446 (res = ebml_read_element_length(matroska, &rlength)) < 0)
00447 return res;
00448 size = rlength;
00449
00450 if (size == 4) {
00451 *num= av_int2flt(get_be32(pb));
00452 } else if(size==8){
00453 *num= av_int2dbl(get_be64(pb));
00454 } else{
00455 offset_t pos = url_ftell(pb);
00456 av_log(matroska->ctx, AV_LOG_ERROR,
00457 "Invalid float element size %d at position %"PRIu64" (0x%"PRIx64")\n",
00458 size, pos, pos);
00459 return AVERROR_INVALIDDATA;
00460 }
00461
00462 return 0;
00463 }
00464
00465
00466
00467
00468
00469
00470 static int
00471 ebml_read_ascii (MatroskaDemuxContext *matroska,
00472 uint32_t *id,
00473 char **str)
00474 {
00475 ByteIOContext *pb = &matroska->ctx->pb;
00476 int size, res;
00477 uint64_t rlength;
00478
00479 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
00480 (res = ebml_read_element_length(matroska, &rlength)) < 0)
00481 return res;
00482 size = rlength;
00483
00484
00485
00486 if (size < 0 || !(*str = av_malloc(size + 1))) {
00487 av_log(matroska->ctx, AV_LOG_ERROR, "Memory allocation failed\n");
00488 return AVERROR(ENOMEM);
00489 }
00490 if (get_buffer(pb, (uint8_t *) *str, size) != size) {
00491 offset_t pos = url_ftell(pb);
00492 av_log(matroska->ctx, AV_LOG_ERROR,
00493 "Read error at pos. %"PRIu64" (0x%"PRIx64")\n", pos, pos);
00494 return AVERROR(EIO);
00495 }
00496 (*str)[size] = '\0';
00497
00498 return 0;
00499 }
00500
00501
00502
00503
00504
00505
00506 static int
00507 ebml_read_utf8 (MatroskaDemuxContext *matroska,
00508 uint32_t *id,
00509 char **str)
00510 {
00511 return ebml_read_ascii(matroska, id, str);
00512 }
00513
00514
00515
00516
00517
00518
00519 static int
00520 ebml_read_date (MatroskaDemuxContext *matroska,
00521 uint32_t *id,
00522 int64_t *date)
00523 {
00524 return ebml_read_sint(matroska, id, date);
00525 }
00526
00527
00528
00529
00530
00531
00532
00533 static int
00534 ebml_read_master (MatroskaDemuxContext *matroska,
00535 uint32_t *id)
00536 {
00537 ByteIOContext *pb = &matroska->ctx->pb;
00538 uint64_t length;
00539 MatroskaLevel *level;
00540 int res;
00541
00542 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
00543 (res = ebml_read_element_length(matroska, &length)) < 0)
00544 return res;
00545
00546
00547 if (matroska->num_levels >= EBML_MAX_DEPTH) {
00548 av_log(matroska->ctx, AV_LOG_ERROR,
00549 "File moves beyond max. allowed depth (%d)\n", EBML_MAX_DEPTH);
00550 return AVERROR(ENOSYS);
00551 }
00552
00553
00554 level = &matroska->levels[matroska->num_levels++];
00555 level->start = url_ftell(pb);
00556 level->length = length;
00557
00558 return 0;
00559 }
00560
00561
00562
00563
00564
00565
00566 static int
00567 ebml_read_binary (MatroskaDemuxContext *matroska,
00568 uint32_t *id,
00569 uint8_t **binary,
00570 int *size)
00571 {
00572 ByteIOContext *pb = &matroska->ctx->pb;
00573 uint64_t rlength;
00574 int res;
00575
00576 if ((res = ebml_read_element_id(matroska, id, NULL)) < 0 ||
00577 (res = ebml_read_element_length(matroska, &rlength)) < 0)
00578 return res;
00579 *size = rlength;
00580
00581 if (!(*binary = av_malloc(*size))) {
00582 av_log(matroska->ctx, AV_LOG_ERROR,
00583 "Memory allocation error\n");
00584 return AVERROR(ENOMEM);
00585 }
00586
00587 if (get_buffer(pb, *binary, *size) != *size) {
00588 offset_t pos = url_ftell(pb);
00589 av_log(matroska->ctx, AV_LOG_ERROR,
00590 "Read error at pos. %"PRIu64" (0x%"PRIx64")\n", pos, pos);
00591 return AVERROR(EIO);
00592 }
00593
00594 return 0;
00595 }
00596
00597
00598
00599
00600
00601
00602
00603 static int
00604 matroska_ebmlnum_uint (uint8_t *data,
00605 uint32_t size,
00606 uint64_t *num)
00607 {
00608 int len_mask = 0x80, read = 1, n = 1, num_ffs = 0;
00609 uint64_t total;
00610
00611 if (size <= 0)
00612 return AVERROR_INVALIDDATA;
00613
00614 total = data[0];
00615 while (read <= 8 && !(total & len_mask)) {
00616 read++;
00617 len_mask >>= 1;
00618 }
00619 if (read > 8)
00620 return AVERROR_INVALIDDATA;
00621
00622 if ((total &= (len_mask - 1)) == len_mask - 1)
00623 num_ffs++;
00624 if (size < read)
00625 return AVERROR_INVALIDDATA;
00626 while (n < read) {
00627 if (data[n] == 0xff)
00628 num_ffs++;
00629 total = (total << 8) | data[n];
00630 n++;
00631 }
00632
00633 if (read == num_ffs)
00634 *num = (uint64_t)-1;
00635 else
00636 *num = total;
00637
00638 return read;
00639 }
00640
00641
00642
00643
00644
00645 static int
00646 matroska_ebmlnum_sint (uint8_t *data,
00647 uint32_t size,
00648 int64_t *num)
00649 {
00650 uint64_t unum;
00651 int res;
00652
00653
00654 if ((res = matroska_ebmlnum_uint(data, size, &unum)) < 0)
00655 return res;
00656
00657
00658 if (unum == (uint64_t)-1)
00659 *num = INT64_MAX;
00660 else
00661 *num = unum - ((1LL << ((7 * res) - 1)) - 1);
00662
00663 return res;
00664 }
00665
00666
00667
00668
00669
00670
00671 static int
00672 ebml_read_header (MatroskaDemuxContext *matroska,
00673 char **doctype,
00674 int *version)
00675 {
00676 uint32_t id;
00677 int level_up, res = 0;
00678
00679
00680 if (doctype)
00681 *doctype = NULL;
00682 if (version)
00683 *version = 1;
00684
00685 if (!(id = ebml_peek_id(matroska, &level_up)) ||
00686 level_up != 0 || id != EBML_ID_HEADER) {
00687 av_log(matroska->ctx, AV_LOG_ERROR,
00688 "This is not an EBML file (id=0x%x/0x%x)\n", id, EBML_ID_HEADER);
00689 return AVERROR_INVALIDDATA;
00690 }
00691 if ((res = ebml_read_master(matroska, &id)) < 0)
00692 return res;
00693
00694 while (res == 0) {
00695 if (!(id = ebml_peek_id(matroska, &level_up)))
00696 return AVERROR(EIO);
00697
00698
00699 if (level_up)
00700 break;
00701
00702 switch (id) {
00703
00704 case EBML_ID_EBMLREADVERSION: {
00705 uint64_t num;
00706
00707 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
00708 return res;
00709 if (num > EBML_VERSION) {
00710 av_log(matroska->ctx, AV_LOG_ERROR,
00711 "EBML version %"PRIu64" (> %d) is not supported\n",
00712 num, EBML_VERSION);
00713 return AVERROR_INVALIDDATA;
00714 }
00715 break;
00716 }
00717
00718
00719 case EBML_ID_EBMLMAXSIZELENGTH: {
00720 uint64_t num;
00721
00722 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
00723 return res;
00724 if (num > sizeof(uint64_t)) {
00725 av_log(matroska->ctx, AV_LOG_ERROR,
00726 "Integers of size %"PRIu64" (> %zd) not supported\n",
00727 num, sizeof(uint64_t));
00728 return AVERROR_INVALIDDATA;
00729 }
00730 break;
00731 }
00732
00733
00734 case EBML_ID_EBMLMAXIDLENGTH: {
00735 uint64_t num;
00736
00737 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
00738 return res;
00739 if (num > sizeof(uint32_t)) {
00740 av_log(matroska->ctx, AV_LOG_ERROR,
00741 "IDs of size %"PRIu64" (> %zu) not supported\n",
00742 num, sizeof(uint32_t));
00743 return AVERROR_INVALIDDATA;
00744 }
00745 break;
00746 }
00747
00748 case EBML_ID_DOCTYPE: {
00749 char *text;
00750
00751 if ((res = ebml_read_ascii(matroska, &id, &text)) < 0)
00752 return res;
00753 if (doctype) {
00754 if (*doctype)
00755 av_free(*doctype);
00756 *doctype = text;
00757 } else
00758 av_free(text);
00759 break;
00760 }
00761
00762 case EBML_ID_DOCTYPEREADVERSION: {
00763 uint64_t num;
00764
00765 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
00766 return res;
00767 if (version)
00768 *version = num;
00769 break;
00770 }
00771
00772 default:
00773 av_log(matroska->ctx, AV_LOG_INFO,
00774 "Unknown data type 0x%x in EBML header", id);
00775
00776
00777 case EBML_ID_VOID:
00778
00779
00780 case EBML_ID_EBMLVERSION:
00781 case EBML_ID_DOCTYPEVERSION:
00782 res = ebml_read_skip (matroska);
00783 break;
00784 }
00785 }
00786
00787 return 0;
00788 }
00789
00790
00791 static int
00792 matroska_find_track_by_num (MatroskaDemuxContext *matroska,
00793 int num)
00794 {
00795 int i;
00796
00797 for (i = 0; i < matroska->num_tracks; i++)
00798 if (matroska->tracks[i]->num == num)
00799 return i;
00800
00801 return -1;
00802 }
00803
00804
00805
00806
00807
00808
00809
00810 static int
00811 matroska_deliver_packet (MatroskaDemuxContext *matroska,
00812 AVPacket *pkt)
00813 {
00814 if (matroska->num_packets > 0) {
00815 memcpy(pkt, matroska->packets[0], sizeof(AVPacket));
00816 av_free(matroska->packets[0]);
00817 if (matroska->num_packets > 1) {
00818 memmove(&matroska->packets[0], &matroska->packets[1],
00819 (matroska->num_packets - 1) * sizeof(AVPacket *));
00820 matroska->packets =
00821 av_realloc(matroska->packets, (matroska->num_packets - 1) *
00822 sizeof(AVPacket *));
00823 } else {
00824 av_freep(&matroska->packets);
00825 }
00826 matroska->num_packets--;
00827 return 0;
00828 }
00829
00830 return -1;
00831 }
00832
00833
00834
00835
00836
00837
00838 static void
00839 matroska_queue_packet (MatroskaDemuxContext *matroska,
00840 AVPacket *pkt)
00841 {
00842 matroska->packets =
00843 av_realloc(matroska->packets, (matroska->num_packets + 1) *
00844 sizeof(AVPacket *));
00845 matroska->packets[matroska->num_packets] = pkt;
00846 matroska->num_packets++;
00847 }
00848
00849
00850
00851
00852
00853
00854 static int
00855 matroska_probe (AVProbeData *p)
00856 {
00857 uint64_t total = 0;
00858 int len_mask = 0x80, size = 1, n = 1;
00859 uint8_t probe_data[] = { 'm', 'a', 't', 'r', 'o', 's', 'k', 'a' };
00860
00861
00862 if (AV_RB32(p->buf) != EBML_ID_HEADER)
00863 return 0;
00864
00865
00866 total = p->buf[4];
00867 while (size <= 8 && !(total & len_mask)) {
00868 size++;
00869 len_mask >>= 1;
00870 }
00871 if (size > 8)
00872 return 0;
00873 total &= (len_mask - 1);
00874 while (n < size)
00875 total = (total << 8) | p->buf[4 + n++];
00876
00877
00878 if (p->buf_size < 4 + size + total)
00879 return 0;
00880
00881
00882
00883
00884
00885 for (n = 4 + size; n <= 4 + size + total - sizeof(probe_data); n++)
00886 if (!memcmp (&p->buf[n], probe_data, sizeof(probe_data)))
00887 return AVPROBE_SCORE_MAX;
00888
00889 return 0;
00890 }
00891
00892
00893
00894
00895
00896 static int
00897 matroska_parse_info (MatroskaDemuxContext *matroska)
00898 {
00899 int res = 0;
00900 uint32_t id;
00901
00902 av_log(matroska->ctx, AV_LOG_DEBUG, "Parsing info...\n");
00903
00904 while (res == 0) {
00905 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
00906 res = AVERROR(EIO);
00907 break;
00908 } else if (matroska->level_up) {
00909 matroska->level_up--;
00910 break;
00911 }
00912
00913 switch (id) {
00914
00915 case MATROSKA_ID_TIMECODESCALE: {
00916 uint64_t num;
00917 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
00918 break;
00919 matroska->time_scale = num;
00920 break;
00921 }
00922
00923 case MATROSKA_ID_DURATION: {
00924 double num;
00925 if ((res = ebml_read_float(matroska, &id, &num)) < 0)
00926 break;
00927 matroska->ctx->duration = num * matroska->time_scale * 1000 / AV_TIME_BASE;
00928 break;
00929 }
00930
00931 case MATROSKA_ID_TITLE: {
00932 char *text;
00933 if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)
00934 break;
00935 strncpy(matroska->ctx->title, text,
00936 sizeof(matroska->ctx->title)-1);
00937 av_free(text);
00938 break;
00939 }
00940
00941 case MATROSKA_ID_WRITINGAPP: {
00942 char *text;
00943 if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)
00944 break;
00945 matroska->writing_app = text;
00946 break;
00947 }
00948
00949 case MATROSKA_ID_MUXINGAPP: {
00950 char *text;
00951 if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)
00952 break;
00953 matroska->muxing_app = text;
00954 break;
00955 }
00956
00957 case MATROSKA_ID_DATEUTC: {
00958 int64_t time;
00959 if ((res = ebml_read_date(matroska, &id, &time)) < 0)
00960 break;
00961 matroska->created = time;
00962 break;
00963 }
00964
00965 default:
00966 av_log(matroska->ctx, AV_LOG_INFO,
00967 "Unknown entry 0x%x in info header\n", id);
00968
00969
00970 case EBML_ID_VOID:
00971 res = ebml_read_skip(matroska);
00972 break;
00973 }
00974
00975 if (matroska->level_up) {
00976 matroska->level_up--;
00977 break;
00978 }
00979 }
00980
00981 return res;
00982 }
00983
00984 static int
00985 matroska_add_stream (MatroskaDemuxContext *matroska)
00986 {
00987 int res = 0;
00988 uint32_t id;
00989 MatroskaTrack *track;
00990
00991 av_log(matroska->ctx, AV_LOG_DEBUG, "parsing track, adding stream..,\n");
00992
00993
00994 track = av_mallocz(MAX_TRACK_SIZE);
00995 matroska->num_tracks++;
00996 strcpy(track->language, "eng");
00997
00998
00999 if ((res = ebml_read_master(matroska, &id)) < 0)
01000 return res;
01001
01002
01003 while (res == 0) {
01004 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
01005 res = AVERROR(EIO);
01006 break;
01007 } else if (matroska->level_up > 0) {
01008 matroska->level_up--;
01009 break;
01010 }
01011
01012 switch (id) {
01013
01014 case MATROSKA_ID_TRACKNUMBER: {
01015 uint64_t num;
01016 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
01017 break;
01018 track->num = num;
01019 break;
01020 }
01021
01022
01023 case MATROSKA_ID_TRACKUID: {
01024 uint64_t num;
01025 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
01026 break;
01027 track->uid = num;
01028 break;
01029 }
01030
01031
01032 case MATROSKA_ID_TRACKTYPE: {
01033 uint64_t num;
01034 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
01035 break;
01036 if (track->type && track->type != num) {
01037 av_log(matroska->ctx, AV_LOG_INFO,
01038 "More than one tracktype in an entry - skip\n");
01039 break;
01040 }
01041 track->type = num;
01042
01043 switch (track->type) {
01044 case MATROSKA_TRACK_TYPE_VIDEO:
01045 case MATROSKA_TRACK_TYPE_AUDIO:
01046 case MATROSKA_TRACK_TYPE_SUBTITLE:
01047 break;
01048 case MATROSKA_TRACK_TYPE_COMPLEX:
01049 case MATROSKA_TRACK_TYPE_LOGO:
01050 case MATROSKA_TRACK_TYPE_CONTROL:
01051 default:
01052 av_log(matroska->ctx, AV_LOG_INFO,
01053 "Unknown or unsupported track type 0x%x\n",
01054 track->type);
01055 track->type = 0;
01056 break;
01057 }
01058 matroska->tracks[matroska->num_tracks - 1] = track;
01059 break;
01060 }
01061
01062
01063 case MATROSKA_ID_TRACKVIDEO: {
01064 MatroskaVideoTrack *videotrack;
01065 if (!track->type)
01066 track->type = MATROSKA_TRACK_TYPE_VIDEO;
01067 if (track->type != MATROSKA_TRACK_TYPE_VIDEO) {
01068 av_log(matroska->ctx, AV_LOG_INFO,
01069 "video data in non-video track - ignoring\n");
01070 res = AVERROR_INVALIDDATA;
01071 break;
01072 } else if ((res = ebml_read_master(matroska, &id)) < 0)
01073 break;
01074 videotrack = (MatroskaVideoTrack *)track;
01075
01076 while (res == 0) {
01077 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
01078 res = AVERROR(EIO);
01079 break;
01080 } else if (matroska->level_up > 0) {
01081 matroska->level_up--;
01082 break;
01083 }
01084
01085 switch (id) {
01086
01087 case MATROSKA_ID_TRACKDEFAULTDURATION: {
01088 uint64_t num;
01089 if ((res = ebml_read_uint (matroska, &id,
01090 &num)) < 0)
01091 break;
01092 track->default_duration = num;
01093 break;
01094 }
01095
01096
01097 case MATROSKA_ID_VIDEOFRAMERATE: {
01098 double num;
01099 if ((res = ebml_read_float(matroska, &id,
01100 &num)) < 0)
01101 break;
01102 if (!track->default_duration)
01103 track->default_duration = 1000000000/num;
01104 break;
01105 }
01106
01107
01108 case MATROSKA_ID_VIDEODISPLAYWIDTH: {
01109 uint64_t num;
01110 if ((res = ebml_read_uint(matroska, &id,
01111 &num)) < 0)
01112 break;
01113 videotrack->display_width = num;
01114 break;
01115 }
01116
01117
01118 case MATROSKA_ID_VIDEODISPLAYHEIGHT: {
01119 uint64_t num;
01120 if ((res = ebml_read_uint(matroska, &id,
01121 &num)) < 0)
01122 break;
01123 videotrack->display_height = num;
01124 break;
01125 }
01126
01127
01128 case MATROSKA_ID_VIDEOPIXELWIDTH: {
01129 uint64_t num;
01130 if ((res = ebml_read_uint(matroska, &id,
01131 &num)) < 0)
01132 break;
01133 videotrack->pixel_width = num;
01134 break;
01135 }
01136
01137
01138 case MATROSKA_ID_VIDEOPIXELHEIGHT: {
01139 uint64_t num;
01140 if ((res = ebml_read_uint(matroska, &id,
01141 &num)) < 0)
01142 break;
01143 videotrack->pixel_height = num;
01144 break;
01145 }
01146
01147
01148 case MATROSKA_ID_VIDEOFLAGINTERLACED: {
01149 uint64_t num;
01150 if ((res = ebml_read_uint(matroska, &id,
01151 &num)) < 0)
01152 break;
01153 if (num)
01154 track->flags |=
01155 MATROSKA_VIDEOTRACK_INTERLACED;
01156 else
01157 track->flags &=
01158 ~MATROSKA_VIDEOTRACK_INTERLACED;
01159 break;
01160 }
01161
01162
01163
01164
01165
01166 case MATROSKA_ID_VIDEOSTEREOMODE: {
01167 uint64_t num;
01168 if ((res = ebml_read_uint(matroska, &id,
01169 &num)) < 0)
01170 break;
01171 if (num != MATROSKA_EYE_MODE_MONO &&
01172 num != MATROSKA_EYE_MODE_LEFT &&
01173 num != MATROSKA_EYE_MODE_RIGHT &&
01174 num != MATROSKA_EYE_MODE_BOTH) {
01175 av_log(matroska->ctx, AV_LOG_INFO,
01176 "Ignoring unknown eye mode 0x%x\n",
01177 (uint32_t) num);
01178 break;
01179 }
01180 videotrack->eye_mode = num;
01181 break;
01182 }
01183
01184
01185 case MATROSKA_ID_VIDEOASPECTRATIO: {
01186 uint64_t num;
01187 if ((res = ebml_read_uint(matroska, &id,
01188 &num)) < 0)
01189 break;
01190 if (num != MATROSKA_ASPECT_RATIO_MODE_FREE &&
01191 num != MATROSKA_ASPECT_RATIO_MODE_KEEP &&
01192 num != MATROSKA_ASPECT_RATIO_MODE_FIXED) {
01193 av_log(matroska->ctx, AV_LOG_INFO,
01194 "Ignoring unknown aspect ratio 0x%x\n",
01195 (uint32_t) num);
01196 break;
01197 }
01198 videotrack->ar_mode = num;
01199 break;
01200 }
01201
01202
01203
01204 case MATROSKA_ID_VIDEOCOLOURSPACE: {
01205 uint64_t num;
01206 if ((res = ebml_read_uint(matroska, &id,
01207 &num)) < 0)
01208 break;
01209 videotrack->fourcc = num;
01210 break;
01211 }
01212
01213 default:
01214 av_log(matroska->ctx, AV_LOG_INFO,
01215 "Unknown video track header entry "
01216 "0x%x - ignoring\n", id);
01217
01218
01219 case EBML_ID_VOID:
01220 res = ebml_read_skip(matroska);
01221 break;
01222 }
01223
01224 if (matroska->level_up) {
01225 matroska->level_up--;
01226 break;
01227 }
01228 }
01229 break;
01230 }
01231
01232
01233 case MATROSKA_ID_TRACKAUDIO: {
01234 MatroskaAudioTrack *audiotrack;
01235 if (!track->type)
01236 track->type = MATROSKA_TRACK_TYPE_AUDIO;
01237 if (track->type != MATROSKA_TRACK_TYPE_AUDIO) {
01238 av_log(matroska->ctx, AV_LOG_INFO,
01239 "audio data in non-audio track - ignoring\n");
01240 res = AVERROR_INVALIDDATA;
01241 break;
01242 } else if ((res = ebml_read_master(matroska, &id)) < 0)
01243 break;
01244 audiotrack = (MatroskaAudioTrack *)track;
01245 audiotrack->channels = 1;
01246 audiotrack->samplerate = 8000;
01247
01248 while (res == 0) {
01249 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
01250 res = AVERROR(EIO);
01251 break;
01252 } else if (matroska->level_up > 0) {
01253 matroska->level_up--;
01254 break;
01255 }
01256
01257 switch (id) {
01258
01259 case MATROSKA_ID_AUDIOSAMPLINGFREQ: {
01260 double num;
01261 if ((res = ebml_read_float(matroska, &id,
01262 &num)) < 0)
01263 break;
01264 audiotrack->internal_samplerate =
01265 audiotrack->samplerate = num;
01266 break;
01267 }
01268
01269 case MATROSKA_ID_AUDIOOUTSAMPLINGFREQ: {
01270 double num;
01271 if ((res = ebml_read_float(matroska, &id,
01272 &num)) < 0)
01273 break;
01274 audiotrack->samplerate = num;
01275 break;
01276 }
01277
01278
01279 case MATROSKA_ID_AUDIOBITDEPTH: {
01280 uint64_t num;
01281 if ((res = ebml_read_uint(matroska, &id,
01282 &num)) < 0)
01283 break;
01284 audiotrack->bitdepth = num;
01285 break;
01286 }
01287
01288
01289 case MATROSKA_ID_AUDIOCHANNELS: {
01290 uint64_t num;
01291 if ((res = ebml_read_uint(matroska, &id,
01292 &num)) < 0)
01293 break;
01294 audiotrack->channels = num;
01295 break;
01296 }
01297
01298 default:
01299 av_log(matroska->ctx, AV_LOG_INFO,
01300 "Unknown audio track header entry "
01301 "0x%x - ignoring\n", id);
01302
01303
01304 case EBML_ID_VOID:
01305 res = ebml_read_skip(matroska);
01306 break;
01307 }
01308
01309 if (matroska->level_up) {
01310 matroska->level_up--;
01311 break;
01312 }
01313 }
01314 break;
01315 }
01316
01317
01318 case MATROSKA_ID_CODECID: {
01319 char *text;
01320 if ((res = ebml_read_ascii(matroska, &id, &text)) < 0)
01321 break;
01322 track->codec_id = text;
01323 break;
01324 }
01325
01326
01327 case MATROSKA_ID_CODECPRIVATE: {
01328 uint8_t *data;
01329 int size;
01330 if ((res = ebml_read_binary(matroska, &id, &data, &size) < 0))
01331 break;
01332 track->codec_priv = data;
01333 track->codec_priv_size = size;
01334 break;
01335 }
01336
01337
01338 case MATROSKA_ID_CODECNAME: {
01339 char *text;
01340 if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)
01341 break;
01342 track->codec_name = text;
01343 break;
01344 }
01345
01346
01347 case MATROSKA_ID_TRACKNAME: {
01348 char *text;
01349 if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)
01350 break;
01351 track->name = text;
01352 break;
01353 }
01354
01355
01356 case MATROSKA_ID_TRACKLANGUAGE: {
01357 char *text, *end;
01358 if ((res = ebml_read_utf8(matroska, &id, &text)) < 0)
01359 break;
01360 if ((end = strchr(text, '-')))
01361 *end = '\0';
01362 if (strlen(text) == 3)
01363 strcpy(track->language, text);
01364 av_free(text);
01365 break;
01366 }
01367
01368
01369 case MATROSKA_ID_TRACKFLAGENABLED: {
01370 uint64_t num;
01371 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
01372 break;
01373 if (num)
01374 track->flags |= MATROSKA_TRACK_ENABLED;
01375 else
01376 track->flags &= ~MATROSKA_TRACK_ENABLED;
01377 break;
01378 }
01379
01380
01381 case MATROSKA_ID_TRACKFLAGDEFAULT: {
01382 uint64_t num;
01383 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
01384 break;
01385 if (num)
01386 track->flags |= MATROSKA_TRACK_DEFAULT;
01387 else
01388 track->flags &= ~MATROSKA_TRACK_DEFAULT;
01389 break;
01390 }
01391
01392
01393
01394 case MATROSKA_ID_TRACKFLAGLACING: {
01395 uint64_t num;
01396 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
01397 break;
01398 if (num)
01399 track->flags |= MATROSKA_TRACK_LACING;
01400 else
01401 track->flags &= ~MATROSKA_TRACK_LACING;
01402 break;
01403 }
01404
01405
01406 case MATROSKA_ID_TRACKDEFAULTDURATION: {
01407 uint64_t num;
01408 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
01409 break;
01410 track->default_duration = num;
01411 break;
01412 }
01413
01414 default:
01415 av_log(matroska->ctx, AV_LOG_INFO,
01416 "Unknown track header entry 0x%x - ignoring\n", id);
01417
01418
01419 case EBML_ID_VOID:
01420
01421 case MATROSKA_ID_CODECINFOURL:
01422 case MATROSKA_ID_CODECDOWNLOADURL:
01423 case MATROSKA_ID_TRACKMINCACHE:
01424 case MATROSKA_ID_TRACKMAXCACHE:
01425 res = ebml_read_skip(matroska);
01426 break;
01427 }
01428
01429 if (matroska->level_up) {
01430 matroska->level_up--;
01431 break;
01432 }
01433 }
01434
01435 return res;
01436 }
01437
01438 static int
01439 matroska_parse_tracks (MatroskaDemuxContext *matroska)
01440 {
01441 int res = 0;
01442 uint32_t id;
01443
01444 av_log(matroska->ctx, AV_LOG_DEBUG, "parsing tracks...\n");
01445
01446 while (res == 0) {
01447 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
01448 res = AVERROR(EIO);
01449 break;
01450 } else if (matroska->level_up) {
01451 matroska->level_up--;
01452 break;
01453 }
01454
01455 switch (id) {
01456
01457 case MATROSKA_ID_TRACKENTRY:
01458 res = matroska_add_stream(matroska);
01459 break;
01460
01461 default:
01462 av_log(matroska->ctx, AV_LOG_INFO,
01463 "Unknown entry 0x%x in track header\n", id);
01464
01465
01466 case EBML_ID_VOID:
01467 res = ebml_read_skip(matroska);
01468 break;
01469 }
01470
01471 if (matroska->level_up) {
01472 matroska->level_up--;
01473 break;
01474 }
01475 }
01476
01477 return res;
01478 }
01479
01480 static int
01481 matroska_parse_index (MatroskaDemuxContext *matroska)
01482 {
01483 int res = 0;
01484 uint32_t id;
01485 MatroskaDemuxIndex idx;
01486
01487 av_log(matroska->ctx, AV_LOG_DEBUG, "parsing index...\n");
01488
01489 while (res == 0) {
01490 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
01491 res = AVERROR(EIO);
01492 break;
01493 } else if (matroska->level_up) {
01494 matroska->level_up--;
01495 break;
01496 }
01497
01498 switch (id) {
01499
01500 case MATROSKA_ID_POINTENTRY:
01501 if ((res = ebml_read_master(matroska, &id)) < 0)
01502 break;
01503
01504
01505
01506 idx.pos = (uint64_t) -1;
01507 idx.time = (uint64_t) -1;
01508 idx.track = (uint16_t) -1;
01509
01510 while (res == 0) {
01511 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
01512 res = AVERROR(EIO);
01513 break;
01514 } else if (matroska->level_up) {
01515 matroska->level_up--;
01516 break;
01517 }
01518
01519 switch (id) {
01520
01521 case MATROSKA_ID_CUETIME: {
01522 uint64_t time;
01523 if ((res = ebml_read_uint(matroska, &id,
01524 &time)) < 0)
01525 break;
01526 idx.time = time * matroska->time_scale;
01527 break;
01528 }
01529
01530
01531
01532 case MATROSKA_ID_CUETRACKPOSITION:
01533 if ((res = ebml_read_master(matroska, &id)) < 0)
01534 break;
01535
01536 while (res == 0) {
01537 if (!(id = ebml_peek_id (matroska,
01538 &matroska->level_up))) {
01539 res = AVERROR(EIO);
01540 break;
01541 } else if (matroska->level_up) {
01542 matroska->level_up--;
01543 break;
01544 }
01545
01546 switch (id) {
01547
01548 case MATROSKA_ID_CUETRACK: {
01549 uint64_t num;
01550 if ((res = ebml_read_uint(matroska,
01551 &id, &num)) < 0)
01552 break;
01553 idx.track = num;
01554 break;
01555 }
01556
01557
01558 case MATROSKA_ID_CUECLUSTERPOSITION: {
01559 uint64_t num;
01560 if ((res = ebml_read_uint(matroska,
01561 &id, &num)) < 0)
01562 break;
01563 idx.pos = num+matroska->segment_start;
01564 break;
01565 }
01566
01567 default:
01568 av_log(matroska->ctx, AV_LOG_INFO,
01569 "Unknown entry 0x%x in "
01570 "CuesTrackPositions\n", id);
01571
01572
01573 case EBML_ID_VOID:
01574 res = ebml_read_skip(matroska);
01575 break;
01576 }
01577
01578 if (matroska->level_up) {
01579 matroska->level_up--;
01580 break;
01581 }
01582 }
01583
01584 break;
01585
01586 default:
01587 av_log(matroska->ctx, AV_LOG_INFO,
01588 "Unknown entry 0x%x in cuespoint "
01589 "index\n", id);
01590
01591
01592 case EBML_ID_VOID:
01593 res = ebml_read_skip(matroska);
01594 break;
01595 }
01596
01597 if (matroska->level_up) {
01598 matroska->level_up--;
01599 break;
01600 }
01601 }
01602
01603
01604 if (idx.pos != (uint64_t) -1 &&
01605 idx.time != (uint64_t) -1 &&
01606 idx.track != (uint16_t) -1) {
01607 if (matroska->num_indexes % 32 == 0) {
01608
01609 matroska->index =
01610 av_realloc(matroska->index,
01611 (matroska->num_indexes + 32) *
01612 sizeof(MatroskaDemuxIndex));
01613 }
01614 matroska->index[matroska->num_indexes] = idx;
01615 matroska->num_indexes++;
01616 }
01617 break;
01618
01619 default:
01620 av_log(matroska->ctx, AV_LOG_INFO,
01621 "Unknown entry 0x%x in cues header\n", id);
01622
01623
01624 case EBML_ID_VOID:
01625 res = ebml_read_skip(matroska);
01626 break;
01627 }
01628
01629 if (matroska->level_up) {
01630 matroska->level_up--;
01631 break;
01632 }
01633 }
01634
01635 return res;
01636 }
01637
01638 static int
01639 matroska_parse_metadata (MatroskaDemuxContext *matroska)
01640 {
01641 int res = 0;
01642 uint32_t id;
01643
01644 while (res == 0) {
01645 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
01646 res = AVERROR(EIO);
01647 break;
01648 } else if (matroska->level_up) {
01649 matroska->level_up--;
01650 break;
01651 }
01652
01653 switch (id) {
01654
01655 default:
01656 av_log(matroska->ctx, AV_LOG_INFO,
01657 "Unknown entry 0x%x in metadata header\n", id);
01658
01659
01660 case EBML_ID_VOID:
01661 res = ebml_read_skip(matroska);
01662 break;
01663 }
01664
01665 if (matroska->level_up) {
01666 matroska->level_up--;
01667 break;
01668 }
01669 }
01670
01671 return res;
01672 }
01673
01674 static int
01675 matroska_parse_seekhead (MatroskaDemuxContext *matroska)
01676 {
01677 int res = 0;
01678 uint32_t id;
01679
01680 av_log(matroska->ctx, AV_LOG_DEBUG, "parsing seekhead...\n");
01681
01682 while (res == 0) {
01683 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
01684 res = AVERROR(EIO);
01685 break;
01686 } else if (matroska->level_up) {
01687 matroska->level_up--;
01688 break;
01689 }
01690
01691 switch (id) {
01692 case MATROSKA_ID_SEEKENTRY: {
01693 uint32_t seek_id = 0, peek_id_cache = 0;
01694 uint64_t seek_pos = (uint64_t) -1, t;
01695
01696 if ((res = ebml_read_master(matroska, &id)) < 0)
01697 break;
01698
01699 while (res == 0) {
01700 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
01701 res = AVERROR(EIO);
01702 break;
01703 } else if (matroska->level_up) {
01704 matroska->level_up--;
01705 break;
01706 }
01707
01708 switch (id) {
01709 case MATROSKA_ID_SEEKID:
01710 res = ebml_read_uint(matroska, &id, &t);
01711 seek_id = t;
01712 break;
01713
01714 case MATROSKA_ID_SEEKPOSITION:
01715 res = ebml_read_uint(matroska, &id, &seek_pos);
01716 break;
01717
01718 default:
01719 av_log(matroska->ctx, AV_LOG_INFO,
01720 "Unknown seekhead ID 0x%x\n", id);
01721
01722
01723 case EBML_ID_VOID:
01724 res = ebml_read_skip(matroska);
01725 break;
01726 }
01727
01728 if (matroska->level_up) {
01729 matroska->level_up--;
01730 break;
01731 }
01732 }
01733
01734 if (!seek_id || seek_pos == (uint64_t) -1) {
01735 av_log(matroska->ctx, AV_LOG_INFO,
01736 "Incomplete seekhead entry (0x%x/%"PRIu64")\n",
01737 seek_id, seek_pos);
01738 break;
01739 }
01740
01741 switch (seek_id) {
01742 case MATROSKA_ID_CUES:
01743 case MATROSKA_ID_TAGS: {
01744 uint32_t level_up = matroska->level_up;
01745 offset_t before_pos;
01746 uint64_t length;
01747 MatroskaLevel level;
01748
01749
01750 peek_id_cache = matroska->peek_id;
01751 before_pos = url_ftell(&matroska->ctx->pb);
01752
01753
01754 if ((res = ebml_read_seek(matroska, seek_pos +
01755 matroska->segment_start)) < 0)
01756 return res;
01757
01758
01759
01760 if (matroska->num_levels == EBML_MAX_DEPTH) {
01761 av_log(matroska->ctx, AV_LOG_INFO,
01762 "Max EBML element depth (%d) reached, "
01763 "cannot parse further.\n", EBML_MAX_DEPTH);
01764 return AVERROR_UNKNOWN;
01765 }
01766
01767 level.start = 0;
01768 level.length = (uint64_t)-1;
01769 matroska->levels[matroska->num_levels] = level;
01770 matroska->num_levels++;
01771
01772
01773 if (!(id = ebml_peek_id (matroska,
01774 &matroska->level_up)))
01775 goto finish;
01776 if (id != seek_id) {
01777 av_log(matroska->ctx, AV_LOG_INFO,
01778 "We looked for ID=0x%x but got "
01779 "ID=0x%x (pos=%"PRIu64")",
01780 seek_id, id, seek_pos +
01781 matroska->segment_start);
01782 goto finish;
01783 }
01784
01785
01786 if ((res = ebml_read_master(matroska, &id)) < 0)
01787 goto finish;
01788 switch (id) {
01789 case MATROSKA_ID_CUES:
01790 if (!(res = matroska_parse_index(matroska)) ||
01791 url_feof(&matroska->ctx->pb)) {
01792 matroska->index_parsed = 1;
01793 res = 0;
01794 }
01795 break;
01796 case MATROSKA_ID_TAGS:
01797 if (!(res = matroska_parse_metadata(matroska)) ||
01798 url_feof(&matroska->ctx->pb)) {
01799 matroska->metadata_parsed = 1;
01800 res = 0;
01801 }
01802 break;
01803 }
01804
01805 finish:
01806
01807 while (matroska->num_levels) {
01808 matroska->num_levels--;
01809 length =
01810 matroska->levels[matroska->num_levels].length;
01811 if (length == (uint64_t)-1)
01812 break;
01813 }
01814
01815
01816 if ((res = ebml_read_seek(matroska, before_pos)) < 0)
01817 return res;
01818 matroska->peek_id = peek_id_cache;
01819 matroska->level_up = level_up;
01820 break;
01821 }
01822
01823 default:
01824 av_log(matroska->ctx, AV_LOG_INFO,
01825 "Ignoring seekhead entry for ID=0x%x\n",
01826 seek_id);
01827 break;
01828 }
01829
01830 break;
01831 }
01832
01833 default:
01834 av_log(matroska->ctx, AV_LOG_INFO,
01835 "Unknown seekhead ID 0x%x\n", id);
01836
01837
01838 case EBML_ID_VOID:
01839 res = ebml_read_skip(matroska);
01840 break;
01841 }
01842
01843 if (matroska->level_up) {
01844 matroska->level_up--;
01845 break;
01846 }
01847 }
01848
01849 return res;
01850 }
01851
01852 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x))
01853
01854 static int
01855 matroska_aac_profile (char *codec_id)
01856 {
01857 static const char *aac_profiles[] = {
01858 "MAIN", "LC", "SSR"
01859 };
01860 int profile;
01861
01862 for (profile=0; profile<ARRAY_SIZE(aac_profiles); profile++)
01863 if (strstr(codec_id, aac_profiles[profile]))
01864 break;
01865 return profile + 1;
01866 }
01867
01868 static int
01869 matroska_aac_sri (int samplerate)
01870 {
01871 static const int aac_sample_rates[] = {
01872 96000, 88200, 64000, 48000, 44100, 32000,
01873 24000, 22050, 16000, 12000, 11025, 8000,
01874 };
01875 int sri;
01876
01877 for (sri=0; sri<ARRAY_SIZE(aac_sample_rates); sri++)
01878 if (aac_sample_rates[sri] == samplerate)
01879 break;
01880 return sri;
01881 }
01882
01883 static int
01884 matroska_read_header (AVFormatContext *s,
01885 AVFormatParameters *ap)
01886 {
01887 MatroskaDemuxContext *matroska = s->priv_data;
01888 char *doctype;
01889 int version, last_level, res = 0;
01890 uint32_t id;
01891
01892 matroska->ctx = s;
01893
01894
01895 doctype = NULL;
01896 if ((res = ebml_read_header(matroska, &doctype, &version)) < 0)
01897 return res;
01898 if ((doctype == NULL) || strcmp(doctype, "matroska")) {
01899 av_log(matroska->ctx, AV_LOG_ERROR,
01900 "Wrong EBML doctype ('%s' != 'matroska').\n",
01901 doctype ? doctype : "(none)");
01902 if (doctype)
01903 av_free(doctype);
01904 return AVERROR_NOFMT;
01905 }
01906 av_free(doctype);
01907 if (version > 2) {
01908 av_log(matroska->ctx, AV_LOG_ERROR,
01909 "Matroska demuxer version 2 too old for file version %d\n",
01910 version);
01911 return AVERROR_NOFMT;
01912 }
01913
01914
01915 while (1) {
01916 if (!(id = ebml_peek_id(matroska, &last_level)))
01917 return AVERROR(EIO);
01918 if (id == MATROSKA_ID_SEGMENT)
01919 break;
01920
01921
01922 av_log(matroska->ctx, AV_LOG_INFO,
01923 "Expected a Segment ID (0x%x), but received 0x%x!\n",
01924 MATROSKA_ID_SEGMENT, id);
01925 if ((res = ebml_read_skip(matroska)) < 0)
01926 return res;
01927 }
01928
01929
01930
01931
01932 if ((res = ebml_read_master(matroska, &id)) < 0)
01933 return res;
01934 matroska->segment_start = url_ftell(&s->pb);
01935
01936 matroska->time_scale = 1000000;
01937
01938 while (res == 0) {
01939 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
01940 res = AVERROR(EIO);
01941 break;
01942 } else if (matroska->level_up) {
01943 matroska->level_up--;
01944 break;
01945 }
01946
01947 switch (id) {
01948
01949 case MATROSKA_ID_INFO: {
01950 if ((res = ebml_read_master(matroska, &id)) < 0)
01951 break;
01952 res = matroska_parse_info(matroska);
01953 break;
01954 }
01955
01956
01957 case MATROSKA_ID_TRACKS: {
01958 if ((res = ebml_read_master(matroska, &id)) < 0)
01959 break;
01960 res = matroska_parse_tracks(matroska);
01961 break;
01962 }
01963
01964
01965 case MATROSKA_ID_CUES: {
01966 if (!matroska->index_parsed) {
01967 if ((res = ebml_read_master(matroska, &id)) < 0)
01968 break;
01969 res = matroska_parse_index(matroska);
01970 } else
01971 res = ebml_read_skip(matroska);
01972 break;
01973 }
01974
01975
01976 case MATROSKA_ID_TAGS: {
01977 if (!matroska->metadata_parsed) {
01978 if ((res = ebml_read_master(matroska, &id)) < 0)
01979 break;
01980 res = matroska_parse_metadata(matroska);
01981 } else
01982 res = ebml_read_skip(matroska);
01983 break;
01984 }
01985
01986
01987 case MATROSKA_ID_SEEKHEAD: {
01988 if ((res = ebml_read_master(matroska, &id)) < 0)
01989 break;
01990 res = matroska_parse_seekhead(matroska);
01991 break;
01992 }
01993
01994 case MATROSKA_ID_CLUSTER: {
01995
01996
01997 res = 1;
01998 break;
01999 }
02000
02001 default:
02002 av_log(matroska->ctx, AV_LOG_INFO,
02003 "Unknown matroska file header ID 0x%x\n", id);
02004
02005
02006 case EBML_ID_VOID:
02007 res = ebml_read_skip(matroska);
02008 break;
02009 }
02010
02011 if (matroska->level_up) {
02012 matroska->level_up--;
02013 break;
02014 }
02015 }
02016
02017
02018 if (ebml_peek_id(matroska, NULL) == MATROSKA_ID_CLUSTER) {
02019 int i, j;
02020 MatroskaTrack *track;
02021 AVStream *st;
02022
02023 for (i = 0; i < matroska->num_tracks; i++) {
02024 enum CodecID codec_id = CODEC_ID_NONE;
02025 uint8_t *extradata = NULL;
02026 int extradata_size = 0;
02027 int extradata_offset = 0;
02028 track = matroska->tracks[i];
02029 track->stream_index = -1;
02030
02031
02032 if (track->codec_id == NULL)
02033 continue;
02034
02035 for(j=0; ff_mkv_codec_tags[j].str; j++){
02036 if(!strncmp(ff_mkv_codec_tags[j].str, track->codec_id,
02037 strlen(ff_mkv_codec_tags[j].str))){
02038 codec_id= ff_mkv_codec_tags[j].id;
02039 break;
02040 }
02041 }
02042
02043
02044
02045
02046 if (!strcmp(track->codec_id,
02047 MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC) &&
02048 (track->codec_priv_size >= 40) &&
02049 (track->codec_priv != NULL)) {
02050 MatroskaVideoTrack *vtrack = (MatroskaVideoTrack *) track;
02051
02052
02053 vtrack->fourcc = AV_RL32(track->codec_priv + 16);
02054 codec_id = codec_get_id(codec_bmp_tags, vtrack->fourcc);
02055
02056 }
02057
02058
02059
02060 else if (!strcmp(track->codec_id,
02061 MATROSKA_CODEC_ID_AUDIO_ACM) &&
02062 (track->codec_priv_size >= 18) &&
02063 (track->codec_priv != NULL)) {
02064 uint16_t tag;
02065
02066
02067 tag = AV_RL16(track->codec_priv);
02068 codec_id = codec_get_id(codec_wav_tags, tag);
02069
02070 }
02071
02072 else if (codec_id == CODEC_ID_AAC && !track->codec_priv_size) {
02073 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *) track;
02074 int profile = matroska_aac_profile(track->codec_id);
02075 int sri = matroska_aac_sri(audiotrack->internal_samplerate);
02076 extradata = av_malloc(5);
02077 if (extradata == NULL)
02078 return AVERROR(ENOMEM);
02079 extradata[0] = (profile << 3) | ((sri&0x0E) >> 1);
02080 extradata[1] = ((sri&0x01) << 7) | (audiotrack->channels<<3);
02081 if (strstr(track->codec_id, "SBR")) {
02082 sri = matroska_aac_sri(audiotrack->samplerate);
02083 extradata[2] = 0x56;
02084 extradata[3] = 0xE5;
02085 extradata[4] = 0x80 | (sri<<3);
02086 extradata_size = 5;
02087 } else {
02088 extradata_size = 2;
02089 }
02090 }
02091
02092 else if (codec_id == CODEC_ID_TTA) {
02093 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *) track;
02094 ByteIOContext b;
02095 extradata_size = 30;
02096 extradata = av_mallocz(extradata_size);
02097 if (extradata == NULL)
02098 return AVERROR(ENOMEM);
02099 init_put_byte(&b, extradata, extradata_size, 1,
02100 NULL, NULL, NULL, NULL);
02101 put_buffer(&b, (uint8_t *) "TTA1", 4);
02102 put_le16(&b, 1);
02103 put_le16(&b, audiotrack->channels);
02104 put_le16(&b, audiotrack->bitdepth);
02105 put_le32(&b, audiotrack->samplerate);
02106 put_le32(&b, matroska->ctx->duration * audiotrack->samplerate);
02107 }
02108
02109 else if (codec_id == CODEC_ID_RV10 || codec_id == CODEC_ID_RV20 ||
02110 codec_id == CODEC_ID_RV30 || codec_id == CODEC_ID_RV40) {
02111 extradata_offset = 26;
02112 track->codec_priv_size -= extradata_offset;
02113 }
02114
02115 else if (codec_id == CODEC_ID_RA_144) {
02116 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track;
02117 audiotrack->samplerate = 8000;
02118 audiotrack->channels = 1;
02119 }
02120
02121 else if (codec_id == CODEC_ID_RA_288 ||
02122 codec_id == CODEC_ID_COOK ||
02123 codec_id == CODEC_ID_ATRAC3) {
02124 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track;
02125 ByteIOContext b;
02126
02127 init_put_byte(&b, track->codec_priv, track->codec_priv_size, 0,
02128 NULL, NULL, NULL, NULL);
02129 url_fskip(&b, 24);
02130 audiotrack->coded_framesize = get_be32(&b);
02131 url_fskip(&b, 12);
02132 audiotrack->sub_packet_h = get_be16(&b);
02133 audiotrack->frame_size = get_be16(&b);
02134 audiotrack->sub_packet_size = get_be16(&b);
02135 audiotrack->buf = av_malloc(audiotrack->frame_size * audiotrack->sub_packet_h);
02136 if (codec_id == CODEC_ID_RA_288) {
02137 audiotrack->block_align = audiotrack->coded_framesize;
02138 track->codec_priv_size = 0;
02139 } else {
02140 audiotrack->block_align = audiotrack->sub_packet_size;
02141 extradata_offset = 78;
02142 track->codec_priv_size -= extradata_offset;
02143 }
02144 }
02145
02146 else if (codec_id == CODEC_ID_TEXT) {
02147 MatroskaSubtitleTrack *subtrack=(MatroskaSubtitleTrack *)track;
02148 if (!strcmp(track->codec_id, "S_TEXT/ASS") ||
02149 !strcmp(track->codec_id, "S_TEXT/SSA") ||
02150 !strcmp(track->codec_id, "S_ASS") ||
02151 !strcmp(track->codec_id, "S_SSA"))
02152 subtrack->ass = 1;
02153 }
02154
02155 if (codec_id == CODEC_ID_NONE) {
02156 av_log(matroska->ctx, AV_LOG_INFO,
02157 "Unknown/unsupported CodecID %s.\n",
02158 track->codec_id);
02159 }
02160
02161 track->stream_index = matroska->num_streams;
02162
02163 matroska->num_streams++;
02164 st = av_new_stream(s, track->stream_index);
02165 if (st == NULL)
02166 return AVERROR(ENOMEM);
02167 av_set_pts_info(st, 64, matroska->time_scale, 1000*1000*1000);
02168
02169 st->codec->codec_id = codec_id;
02170 st->start_time = 0;
02171 if (strcmp(track->language, "und"))
02172 strcpy(st->language, track->language);
02173
02174 if (track->default_duration)
02175 av_reduce(&st->codec->time_base.num, &st->codec->time_base.den,
02176 track->default_duration, 1000000000, 30000);
02177
02178 if(extradata){
02179 st->codec->extradata = extradata;
02180 st->codec->extradata_size = extradata_size;
02181 } else if(track->codec_priv && track->codec_priv_size > 0){
02182 st->codec->extradata = av_malloc(track->codec_priv_size);
02183 if(st->codec->extradata == NULL)
02184 return AVERROR(ENOMEM);
02185 st->codec->extradata_size = track->codec_priv_size;
02186 memcpy(st->codec->extradata,track->codec_priv+extradata_offset,
02187 track->codec_priv_size);
02188 }
02189
02190 if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
02191 MatroskaVideoTrack *videotrack = (MatroskaVideoTrack *)track;
02192
02193 st->codec->codec_type = CODEC_TYPE_VIDEO;
02194 st->codec->codec_tag = videotrack->fourcc;
02195 st->codec->width = videotrack->pixel_width;
02196 st->codec->height = videotrack->pixel_height;
02197 if (videotrack->display_width == 0)
02198 videotrack->display_width= videotrack->pixel_width;
02199 if (videotrack->display_height == 0)
02200 videotrack->display_height= videotrack->pixel_height;
02201 av_reduce(&st->codec->sample_aspect_ratio.num,
02202 &st->codec->sample_aspect_ratio.den,
02203 st->codec->height * videotrack->display_width,
02204 st->codec-> width * videotrack->display_height,
02205 255);
02206 st->need_parsing = AVSTREAM_PARSE_HEADERS;
02207 } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
02208 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track;
02209
02210 st->codec->codec_type = CODEC_TYPE_AUDIO;
02211 st->codec->sample_rate = audiotrack->samplerate;
02212 st->codec->channels = audiotrack->channels;
02213 st->codec->block_align = audiotrack->block_align;
02214 } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) {
02215 st->codec->codec_type = CODEC_TYPE_SUBTITLE;
02216 }
02217
02218
02219 }
02220 res = 0;
02221 }
02222
02223 if (matroska->index_parsed) {
02224 int i, track, stream;
02225 for (i=0; i<matroska->num_indexes; i++) {
02226 MatroskaDemuxIndex *idx = &matroska->index[i];
02227 track = matroska_find_track_by_num(matroska, idx->track);
02228 stream = matroska->tracks[track]->stream_index;
02229 if (stream >= 0)
02230 av_add_index_entry(matroska->ctx->streams[stream],
02231 idx->pos, idx->time/matroska->time_scale,
02232 0, 0, AVINDEX_KEYFRAME);
02233 }
02234 }
02235
02236 return res;
02237 }
02238
02239 static int
02240 matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data, int size,
02241 int64_t pos, uint64_t cluster_time, uint64_t duration,
02242 int is_keyframe, int is_bframe)
02243 {
02244 int res = 0;
02245 int track;
02246 AVStream *st;
02247 AVPacket *pkt;
02248 uint8_t *origdata = data;
02249 int16_t block_time;
02250 uint32_t *lace_size = NULL;
02251 int n, flags, laces = 0;
02252 uint64_t num;
02253
02254
02255 if ((n = matroska_ebmlnum_uint(data, size, &num)) < 0) {
02256 av_log(matroska->ctx, AV_LOG_ERROR, "EBML block data error\n");
02257 av_free(origdata);
02258 return res;
02259 }
02260 data += n;
02261 size -= n;
02262
02263
02264 track = matroska_find_track_by_num(matroska, num);
02265 if (size <= 3 || track < 0 || track >= matroska->num_tracks) {
02266 av_log(matroska->ctx, AV_LOG_INFO,
02267 "Invalid stream %d or size %u\n", track, size);
02268 av_free(origdata);
02269 return res;
02270 }
02271 if (matroska->tracks[track]->stream_index < 0)
02272 return res;
02273 st = matroska->ctx->streams[matroska->tracks[track]->stream_index];
02274 if (st->discard >= AVDISCARD_ALL) {
02275 av_free(origdata);
02276 return res;
02277 }
02278 if (duration == AV_NOPTS_VALUE)
02279 duration = matroska->tracks[track]->default_duration / matroska->time_scale;
02280
02281
02282 block_time = AV_RB16(data);
02283 data += 2;
02284 flags = *data++;
02285 size -= 3;
02286 if (is_keyframe == -1)
02287 is_keyframe = flags & 0x80 ? PKT_FLAG_KEY : 0;
02288
02289 if (matroska->skip_to_keyframe) {
02290 if (!is_keyframe || st != matroska->skip_to_stream)
02291 return res;
02292 matroska->skip_to_keyframe = 0;
02293 }
02294
02295 switch ((flags & 0x06) >> 1) {
02296 case 0x0:
02297 laces = 1;
02298 lace_size = av_mallocz(sizeof(int));
02299 lace_size[0] = size;
02300 break;
02301
02302 case 0x1:
02303 case 0x2:
02304 case 0x3:
02305 if (size == 0) {
02306 res = -1;
02307 break;
02308 }
02309 laces = (*data) + 1;
02310 data += 1;
02311 size -= 1;
02312 lace_size = av_mallocz(laces * sizeof(int));
02313
02314 switch ((flags & 0x06) >> 1) {
02315 case 0x1: {
02316 uint8_t temp;
02317 uint32_t total = 0;
02318 for (n = 0; res == 0 && n < laces - 1; n++) {
02319 while (1) {
02320 if (size == 0) {
02321 res = -1;
02322 break;
02323 }
02324 temp = *data;
02325 lace_size[n] += temp;
02326 data += 1;
02327 size -= 1;
02328 if (temp != 0xff)
02329 break;
02330 }
02331 total += lace_size[n];
02332 }
02333 lace_size[n] = size - total;
02334 break;
02335 }
02336
02337 case 0x2:
02338 for (n = 0; n < laces; n++)
02339 lace_size[n] = size / laces;
02340 break;
02341
02342 case 0x3: {
02343 uint32_t total;
02344 n = matroska_ebmlnum_uint(data, size, &num);
02345 if (n < 0) {
02346 av_log(matroska->ctx, AV_LOG_INFO,
02347 "EBML block data error\n");
02348 break;
02349 }
02350 data += n;
02351 size -= n;
02352 total = lace_size[0] = num;
02353 for (n = 1; res == 0 && n < laces - 1; n++) {
02354 int64_t snum;
02355 int r;
02356 r = matroska_ebmlnum_sint (data, size, &snum);
02357 if (r < 0) {
02358 av_log(matroska->ctx, AV_LOG_INFO,
02359 "EBML block data error\n");
02360 break;
02361 }
02362 data += r;
02363 size -= r;
02364 lace_size[n] = lace_size[n - 1] + snum;
02365 total += lace_size[n];
02366 }
02367 lace_size[n] = size - total;
02368 break;
02369 }
02370 }
02371 break;
02372 }
02373
02374 if (res == 0) {
02375 uint64_t timecode = AV_NOPTS_VALUE;
02376
02377 if (cluster_time != (uint64_t)-1
02378 && (block_time >= 0 || cluster_time >= -block_time))
02379 timecode = cluster_time + block_time;
02380
02381 for (n = 0; n < laces; n++) {
02382 if (st->codec->codec_id == CODEC_ID_RA_288 ||
02383 st->codec->codec_id == CODEC_ID_COOK ||
02384 st->codec->codec_id == CODEC_ID_ATRAC3) {
02385 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)matroska->tracks[track];
02386 int a = st->codec->block_align;
02387 int sps = audiotrack->sub_packet_size;
02388 int cfs = audiotrack->coded_framesize;
02389 int h = audiotrack->sub_packet_h;
02390 int y = audiotrack->sub_packet_cnt;
02391 int w = audiotrack->frame_size;
02392 int x;
02393
02394 if (!audiotrack->pkt_cnt) {
02395 if (st->codec->codec_id == CODEC_ID_RA_288)
02396 for (x=0; x<h/2; x++)
02397 memcpy(audiotrack->buf+x*2*w+y*cfs,
02398 data+x*cfs, cfs);
02399 else
02400 for (x=0; x<w/sps; x++)
02401 memcpy(audiotrack->buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps);
02402
02403 if (++audiotrack->sub_packet_cnt >= h) {
02404 audiotrack->sub_packet_cnt = 0;
02405 audiotrack->pkt_cnt = h*w / a;
02406 }
02407 }
02408 while (audiotrack->pkt_cnt) {
02409 pkt = av_mallocz(sizeof(AVPacket));
02410 av_new_packet(pkt, a);
02411 memcpy(pkt->data, audiotrack->buf
02412 + a * (h*w / a - audiotrack->pkt_cnt--), a);
02413 pkt->pos = pos;
02414 pkt->stream_index = matroska->tracks[track]->stream_index;
02415 matroska_queue_packet(matroska, pkt);
02416 }
02417 } else {
02418 int offset = 0;
02419
02420 if (st->codec->codec_id == CODEC_ID_TEXT
02421 && ((MatroskaSubtitleTrack *)(matroska->tracks[track]))->ass) {
02422 int i;
02423 for (i=0; i<8 && data[offset]; offset++)
02424 if (data[offset] == ',')
02425 i++;
02426 }
02427
02428 pkt = av_mallocz(sizeof(AVPacket));
02429
02430 if (av_new_packet(pkt, lace_size[n]-offset) < 0) {
02431 res = AVERROR(ENOMEM);
02432 n = laces-1;
02433 break;
02434 }
02435 memcpy (pkt->data, data+offset, lace_size[n]-offset);
02436
02437 if (n == 0)
02438 pkt->flags = is_keyframe;
02439 pkt->stream_index = matroska->tracks[track]->stream_index;
02440
02441 pkt->pts = timecode;
02442 pkt->pos = pos;
02443 pkt->duration = duration;
02444
02445 matroska_queue_packet(matroska, pkt);
02446 }
02447
02448 if (timecode != AV_NOPTS_VALUE)
02449 timecode = duration ? timecode + duration : AV_NOPTS_VALUE;
02450 data += lace_size[n];
02451 }
02452 }
02453
02454 av_free(lace_size);
02455 av_free(origdata);
02456 return res;
02457 }
02458
02459 static int
02460 matroska_parse_blockgroup (MatroskaDemuxContext *matroska,
02461 uint64_t cluster_time)
02462 {
02463 int res = 0;
02464 uint32_t id;
02465 int is_bframe = 0;
02466 int is_keyframe = PKT_FLAG_KEY, last_num_packets = matroska->num_packets;
02467 uint64_t duration = AV_NOPTS_VALUE;
02468 uint8_t *data;
02469 int size = 0;
02470 int64_t pos = 0;
02471
02472 av_log(matroska->ctx, AV_LOG_DEBUG, "parsing blockgroup...\n");
02473
02474 while (res == 0) {
02475 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
02476 res = AVERROR(EIO);
02477 break;
02478 } else if (matroska->level_up) {
02479 matroska->level_up--;
02480 break;
02481 }
02482
02483 switch (id) {
02484
02485
02486
02487 case MATROSKA_ID_BLOCK: {
02488 pos = url_ftell(&matroska->ctx->pb);
02489 res = ebml_read_binary(matroska, &id, &data, &size);
02490 break;
02491 }
02492
02493 case MATROSKA_ID_BLOCKDURATION: {
02494 if ((res = ebml_read_uint(matroska, &id, &duration)) < 0)
02495 break;
02496 break;
02497 }
02498
02499 case MATROSKA_ID_BLOCKREFERENCE: {
02500 int64_t num;
02501
02502
02503 is_keyframe = 0;
02504 if (last_num_packets != matroska->num_packets)
02505 matroska->packets[last_num_packets]->flags = 0;
02506 if ((res = ebml_read_sint(matroska, &id, &num)) < 0)
02507 break;
02508 if (num > 0)
02509 is_bframe = 1;
02510 break;
02511 }
02512
02513 default:
02514 av_log(matroska->ctx, AV_LOG_INFO,
02515 "Unknown entry 0x%x in blockgroup data\n", id);
02516
02517
02518 case EBML_ID_VOID:
02519 res = ebml_read_skip(matroska);
02520 break;
02521 }
02522
02523 if (matroska->level_up) {
02524 matroska->level_up--;
02525 break;
02526 }
02527 }
02528
02529 if (res)
02530 return res;
02531
02532 if (size > 0)
02533 res = matroska_parse_block(matroska, data, size, pos, cluster_time,
02534 duration, is_keyframe, is_bframe);
02535
02536 return res;
02537 }
02538
02539 static int
02540 matroska_parse_cluster (MatroskaDemuxContext *matroska)
02541 {
02542 int res = 0;
02543 uint32_t id;
02544 uint64_t cluster_time = 0;
02545 uint8_t *data;
02546 int64_t pos;
02547 int size;
02548
02549 av_log(matroska->ctx, AV_LOG_DEBUG,
02550 "parsing cluster at %"PRId64"\n", url_ftell(&matroska->ctx->pb));
02551
02552 while (res == 0) {
02553 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
02554 res = AVERROR(EIO);
02555 break;
02556 } else if (matroska->level_up) {
02557 matroska->level_up--;
02558 break;
02559 }
02560
02561 switch (id) {
02562
02563 case MATROSKA_ID_CLUSTERTIMECODE: {
02564 uint64_t num;
02565 if ((res = ebml_read_uint(matroska, &id, &num)) < 0)
02566 break;
02567 cluster_time = num;
02568 break;
02569 }
02570
02571
02572 case MATROSKA_ID_BLOCKGROUP:
02573 if ((res = ebml_read_master(matroska, &id)) < 0)
02574 break;
02575 res = matroska_parse_blockgroup(matroska, cluster_time);
02576 break;
02577
02578 case MATROSKA_ID_SIMPLEBLOCK:
02579 pos = url_ftell(&matroska->ctx->pb);
02580 res = ebml_read_binary(matroska, &id, &data, &size);
02581 if (res == 0)
02582 res = matroska_parse_block(matroska, data, size, pos,
02583 cluster_time, AV_NOPTS_VALUE,
02584 -1, 0);
02585 break;
02586
02587 default:
02588 av_log(matroska->ctx, AV_LOG_INFO,
02589 "Unknown entry 0x%x in cluster data\n", id);
02590
02591
02592 case EBML_ID_VOID:
02593 res = ebml_read_skip(matroska);
02594 break;
02595 }
02596
02597 if (matroska->level_up) {
02598 matroska->level_up--;
02599 break;
02600 }
02601 }
02602
02603 return res;
02604 }
02605
02606 static int
02607 matroska_read_packet (AVFormatContext *s,
02608 AVPacket *pkt)
02609 {
02610 MatroskaDemuxContext *matroska = s->priv_data;
02611 int res;
02612 uint32_t id;
02613
02614
02615 while (matroska_deliver_packet(matroska, pkt)) {
02616
02617
02618 if (matroska->done)
02619 return AVERROR(EIO);
02620
02621 res = 0;
02622 while (res == 0) {
02623 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) {
02624 return AVERROR(EIO);
02625 } else if (matroska->level_up) {
02626 matroska->level_up--;
02627 break;
02628 }
02629
02630 switch (id) {
02631 case MATROSKA_ID_CLUSTER:
02632 if ((res = ebml_read_master(matroska, &id)) < 0)
02633 break;
02634 if ((res = matroska_parse_cluster(matroska)) == 0)
02635 res = 1;
02636 break;
02637
02638 default:
02639 case EBML_ID_VOID:
02640 res = ebml_read_skip(matroska);
02641 break;
02642 }
02643
02644 if (matroska->level_up) {
02645 matroska->level_up--;
02646 break;
02647 }
02648 }
02649
02650 if (res == -1)
02651 matroska->done = 1;
02652 }
02653
02654 return 0;
02655 }
02656
02657 static int
02658 matroska_read_seek (AVFormatContext *s, int stream_index, int64_t timestamp,
02659 int flags)
02660 {
02661 MatroskaDemuxContext *matroska = s->priv_data;
02662 AVStream *st = s->streams[stream_index];
02663 int index;
02664
02665
02666 index = av_index_search_timestamp(st, timestamp, flags);
02667 if (index < 0)
02668 return 0;
02669
02670
02671 url_fseek(&s->pb, st->index_entries[index].pos, SEEK_SET);
02672 matroska->skip_to_keyframe = !(flags & AVSEEK_FLAG_ANY);
02673 matroska->skip_to_stream = st;
02674 matroska->num_packets = 0;
02675 matroska->peek_id = 0;
02676 return 0;
02677 }
02678
02679 static int
02680 matroska_read_close (AVFormatContext *s)
02681 {
02682 MatroskaDemuxContext *matroska = s->priv_data;
02683 int n = 0;
02684
02685 av_free(matroska->writing_app);
02686 av_free(matroska->muxing_app);
02687 av_free(matroska->index);
02688
02689 if (matroska->packets != NULL) {
02690 for (n = 0; n < matroska->num_packets; n++) {
02691 av_free_packet(matroska->packets[n]);
02692 av_free(matroska->packets[n]);
02693 }
02694 av_free(matroska->packets);
02695 }
02696
02697 for (n = 0; n < matroska->num_tracks; n++) {
02698 MatroskaTrack *track = matroska->tracks[n];
02699 av_free(track->codec_id);
02700 av_free(track->codec_name);
02701 av_free(track->codec_priv);
02702 av_free(track->name);
02703
02704 if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
02705 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *)track;
02706 av_free(audiotrack->buf);
02707 }
02708
02709 av_free(track);
02710 }
02711
02712 return 0;
02713 }
02714
02715 AVInputFormat matroska_demuxer = {
02716 "matroska",
02717 "Matroska file format",
02718 sizeof(MatroskaDemuxContext),
02719 matroska_probe,
02720 matroska_read_header,
02721 matroska_read_packet,
02722 matroska_read_close,
02723 matroska_read_seek,
02724 };