annotate libmpdemux/demux_mkv.c @ 34346:3d0c795524b0

Fix bug with wrong focus in file selector. The focus can only be set to fsFNameList after it's realized and mapped. This also removes the irritating selection of the fsPathCombo.
author ib
date Sun, 11 Dec 2011 16:02:02 +0000
parents e9a733c1e2a1
children 9120eb514454
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1 /*
29238
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
2 * Matroska demuxer
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
3 * Copyright (C) 2004 Aurelien Jacobs <aurel@gnuage.org>
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
4 * Based on the one written by Ronald Bultje for gstreamer
29238
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
5 * and on demux_mkv.cpp from Moritz Bunkus.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
6 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
7 * This file is part of MPlayer.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
8 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
9 * MPlayer is free software; you can redistribute it and/or modify
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
10 * it under the terms of the GNU General Public License as published by
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
12 * (at your option) any later version.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
13 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
14 * MPlayer is distributed in the hope that it will be useful,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
17 * GNU General Public License for more details.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
18 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
19 * You should have received a copy of the GNU General Public License along
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
20 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 28468
diff changeset
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
22 */
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
23
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
24 #include "config.h"
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
25
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
26 #include <stdlib.h>
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
27 #include <stdio.h>
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
28 #include <ctype.h>
18558
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18507
diff changeset
29 #include <inttypes.h>
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
30
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 22445
diff changeset
31 #include "stream/stream.h"
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
32 #include "demuxer.h"
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
33 #include "stheader.h"
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
34 #include "ebml.h"
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
35 #include "matroska.h"
30573
02420b32391b Add separate header for real_fix_timestamp(); avoids forward declarations.
diego
parents: 30085
diff changeset
36 #include "demux_real.h"
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
37
32461
bc43cf7638e6 Move ass_mp.[ch] to the sub directory.
cigaes
parents: 32459
diff changeset
38 #include "sub/ass_mp.h"
20680
d1a5b0ebf56f add MSGTR_MPDEMUX_MKV for demux_mkv.c
kraymer
parents: 20477
diff changeset
39 #include "mp_msg.h"
d1a5b0ebf56f add MSGTR_MPDEMUX_MKV for demux_mkv.c
kraymer
parents: 20477
diff changeset
40 #include "help_mp.h"
d1a5b0ebf56f add MSGTR_MPDEMUX_MKV for demux_mkv.c
kraymer
parents: 20477
diff changeset
41
32459
1a605463f62b Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents: 32454
diff changeset
42 #include "sub/vobsub.h"
32454
69d3be4d52a2 Create a new directory, "sub", for subtitles and OSD related code.
cigaes
parents: 32225
diff changeset
43 #include "sub/subreader.h"
32467
fbe5c829c69b Move libvo/sub.[ch] from libvo to sub.
cigaes
parents: 32461
diff changeset
44 #include "sub/sub.h"
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
45
22616
09dc129234a0 Matroska seeking fixes
uau
parents: 22606
diff changeset
46 #include "libavutil/common.h"
09dc129234a0 Matroska seeking fixes
uau
parents: 22606
diff changeset
47
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 26752
diff changeset
48 #ifdef CONFIG_QTX_CODECS
22606
97343cedd966 Use explicit path for headers from the loader/ directory.
diego
parents: 22605
diff changeset
49 #include "loader/qtx/qtxsdk/components.h"
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
50 #endif
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
51
28440
2218218264cb Convert CONFIG_ZLIB into a 0/1 option.
diego
parents: 28413
diff changeset
52 #if CONFIG_ZLIB
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
53 #include <zlib.h>
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
54 #endif
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
55
22081
fde1ddcc04c7 Make mkv demuxer use ffmpeg LZO as well.
reimar
parents: 22011
diff changeset
56 #include "libavutil/lzo.h"
23386
585d2136f018 Get rid of __attribute__((__packed__)) in Matroska demuxer
reimar
parents: 23310
diff changeset
57 #include "libavutil/intreadwrite.h"
23703
9fb716ab06a3 Avoid code duplication and ugly config.h hack by using av_strlcat/av_strlcpy
reimar
parents: 23630
diff changeset
58 #include "libavutil/avstring.h"
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
59
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
60 static const unsigned char sipr_swaps[38][2] = {
18036
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
61 {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68},
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
62 {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46},
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
63 {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56},
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
64 {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83},
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
65 {77,80}
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
66 };
18036
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
67
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
68 // Map flavour to bytes per second
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
69 #define SIPR_FLAVORS 4
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
70 #define ATRC_FLAVORS 8
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
71 #define COOK_FLAVORS 34
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
72 static const int sipr_fl2bps[SIPR_FLAVORS] = { 813, 1062, 625, 2000 };
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
73 static const int atrc_fl2bps[ATRC_FLAVORS] = {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
74 8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100 };
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
75 static const int cook_fl2bps[COOK_FLAVORS] = {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
76 1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
77 4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
78 4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
79 12016, 16408, 22911, 33506
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
80 };
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
81
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
82 typedef struct {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
83 uint32_t order, type, scope;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
84 uint32_t comp_algo;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
85 uint8_t *comp_settings;
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
86 size_t comp_settings_len;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
87 } mkv_content_encoding_t;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
88
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
89 typedef struct mkv_track {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
90 int tnum;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
91 char *name;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
92
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
93 char *codec_id;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
94 int ms_compat;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
95 char *language;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
96
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
97 int type;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
98
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
99 uint32_t v_width, v_height, v_dwidth, v_dheight;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
100 float v_frate;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
101
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
102 uint32_t a_formattag;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
103 uint32_t a_channels, a_bps;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
104 float a_sfreq;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
105
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
106 float default_duration;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
107
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
108 int default_track;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
109
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
110 void *private_data;
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
111 size_t private_size;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
112
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
113 /* stuff for realmedia */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
114 int realmedia;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
115 int64_t rv_kf_base;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
116 int rv_kf_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
117 float rv_pts; /* previous video timestamp */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
118 float ra_pts; /* previous audio timestamp */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
119
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
120 /** realaudio descrambling */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
121 int sub_packet_size; ///< sub packet size, per stream
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
122 int sub_packet_h; ///< number of coded frames per block
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
123 int coded_framesize; ///< coded frame size, per stream
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
124 int audiopk_size; ///< audio packet size
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
125 unsigned char *audio_buf; ///< place to store reordered audio data
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
126 float *audio_timestamp; ///< timestamp for each audio packet
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
127 int sub_packet_cnt; ///< number of subpacket already received
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
128 int audio_filepos; ///< file position of first audio packet in block
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
129
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
130 /* stuff for quicktime */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
131 int fix_i_bps;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
132 float qt_last_a_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
133
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
134 int subtitle_type;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
135
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
136 /* The timecodes of video frames might have to be reordered if they're
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
137 in display order (the timecodes, not the frames themselves!). In this
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
138 case demux packets have to be cached with the help of these variables. */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
139 int reorder_timecodes;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
140 demux_packet_t **cached_dps;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
141 int num_cached_dps, num_allocated_dps;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
142 float max_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
143
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
144 /* generic content encoding support */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
145 mkv_content_encoding_t *encodings;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
146 int num_encodings;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
147
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
148 /* For VobSubs and SSA/ASS */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
149 sh_sub_t *sh_sub;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
150 } mkv_track_t;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
151
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
152 typedef struct mkv_index {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
153 int tnum;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
154 uint64_t timecode, filepos;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
155 } mkv_index_t;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
156
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
157 typedef struct mkv_demuxer {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
158 off_t segment_start;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
159
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
160 float duration, last_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
161 uint64_t last_filepos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
162
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
163 mkv_track_t **tracks;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
164 int num_tracks;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
165
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
166 uint64_t tc_scale, cluster_tc, first_tc;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
167 int has_first_tc;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
168
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
169 uint64_t cluster_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
170 uint64_t blockgroup_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
171
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
172 mkv_index_t *indexes;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
173 int num_indexes;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
174
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
175 off_t *parsed_cues;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
176 int parsed_cues_num;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
177 off_t *parsed_seekhead;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
178 int parsed_seekhead_num;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
179
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
180 uint64_t *cluster_positions;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
181 int num_cluster_pos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
182
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
183 int64_t skip_to_timecode;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
184 int v_skip_to_keyframe, a_skip_to_keyframe;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
185
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
186 int64_t stop_timecode;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
187
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
188 int last_aid;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
189 int audio_tracks[MAX_A_STREAMS];
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
190 } mkv_demuxer_t;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
191
23386
585d2136f018 Get rid of __attribute__((__packed__)) in Matroska demuxer
reimar
parents: 23310
diff changeset
192 #define REALHEADER_SIZE 16
585d2136f018 Get rid of __attribute__((__packed__)) in Matroska demuxer
reimar
parents: 23310
diff changeset
193 #define RVPROPERTIES_SIZE 34
585d2136f018 Get rid of __attribute__((__packed__)) in Matroska demuxer
reimar
parents: 23310
diff changeset
194 #define RAPROPERTIES4_SIZE 56
585d2136f018 Get rid of __attribute__((__packed__)) in Matroska demuxer
reimar
parents: 23310
diff changeset
195 #define RAPROPERTIES5_SIZE 70
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
196
20140
1861d40674ca Simplify (by using realloc with NULL parameter) and refactor code to grow
reimar
parents: 20137
diff changeset
197 /**
1861d40674ca Simplify (by using realloc with NULL parameter) and refactor code to grow
reimar
parents: 20137
diff changeset
198 * \brief ensures there is space for at least one additional element
29691
183ea012e25b Change grow_array argument from void ** to void *, this avoids a aliasing
reimar
parents: 29490
diff changeset
199 * \param arrayp array to grow
20140
1861d40674ca Simplify (by using realloc with NULL parameter) and refactor code to grow
reimar
parents: 20137
diff changeset
200 * \param nelem current number of elements in array
1861d40674ca Simplify (by using realloc with NULL parameter) and refactor code to grow
reimar
parents: 20137
diff changeset
201 * \param elsize size of one array element
1861d40674ca Simplify (by using realloc with NULL parameter) and refactor code to grow
reimar
parents: 20137
diff changeset
202 */
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
203 static void av_noinline grow_array(void *arrayp, int nelem, size_t elsize)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
204 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
205 void **array = arrayp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
206 void *oldp = *array;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
207 if (nelem & 31)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
208 return;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
209 if (nelem > UINT_MAX / elsize - 32)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
210 *array = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
211 else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
212 *array = realloc(*array, (nelem + 32) * elsize);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
213 if (!*array)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
214 free(oldp);
20140
1861d40674ca Simplify (by using realloc with NULL parameter) and refactor code to grow
reimar
parents: 20137
diff changeset
215 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
216
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
217 static mkv_track_t *demux_mkv_find_track_by_num(mkv_demuxer_t *d, int n,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
218 int type)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
219 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
220 int i, id;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
221
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
222 for (i = 0, id = 0; i < d->num_tracks; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
223 if (d->tracks[i] != NULL && d->tracks[i]->type == type)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
224 if (id++ == n)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
225 return d->tracks[i];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
226
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
227 return NULL;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
228 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
229
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
230 static void add_cluster_position(mkv_demuxer_t *mkv_d, uint64_t position)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
231 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
232 int i = mkv_d->num_cluster_pos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
233
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
234 while (i--)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
235 if (mkv_d->cluster_positions[i] == position)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
236 return;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
237
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
238 grow_array(&mkv_d->cluster_positions, mkv_d->num_cluster_pos,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
239 sizeof(uint64_t));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
240 if (!mkv_d->cluster_positions) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
241 mkv_d->num_cluster_pos = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
242 return;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
243 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
244 mkv_d->cluster_positions[mkv_d->num_cluster_pos++] = position;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
245 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
246
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
247
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
248 #define AAC_SYNC_EXTENSION_TYPE 0x02b7
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
249 static int aac_get_sample_rate_index(uint32_t sample_rate)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
250 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
251 static const int srates[] = {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
252 92017, 75132, 55426, 46009, 37566, 27713,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
253 23004, 18783, 13856, 11502, 9391, 0
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
254 };
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
255 int i = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
256 while (sample_rate < srates[i])
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
257 i++;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
258 return i;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
259 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
260
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
261 /** \brief Free cached demux packets
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
262 *
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
263 * Reordering the timecodes requires caching of demux packets. This function
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
264 * frees all these cached packets and the memory for the cached pointers
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
265 * itself.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
266 *
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
267 * \param demuxer The demuxer for which the cache is to be freed.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
268 */
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
269 static void free_cached_dps(demuxer_t *demuxer)
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
270 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
271 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
272 mkv_track_t *track;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
273 int i, k;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
274
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
275 for (k = 0; k < mkv_d->num_tracks; k++) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
276 track = mkv_d->tracks[k];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
277 for (i = 0; i < track->num_cached_dps; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
278 free_demux_packet(track->cached_dps[i]);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
279 free(track->cached_dps);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
280 track->cached_dps = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
281 track->num_cached_dps = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
282 track->num_allocated_dps = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
283 track->max_pts = 0;
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
284 }
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
285 }
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
286
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
287 static int demux_mkv_decode(mkv_track_t *track, uint8_t *src,
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
288 uint8_t **dest, size_t *size, uint32_t type)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
289 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
290 int i, result;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
291 int modified = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
292
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
293 *dest = src;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
294 if (track->num_encodings <= 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
295 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
296
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
297 for (i = 0; i < track->num_encodings; i++) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
298 if (!(track->encodings[i].scope & type))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
299 continue;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
300
28440
2218218264cb Convert CONFIG_ZLIB into a 0/1 option.
diego
parents: 28413
diff changeset
301 #if CONFIG_ZLIB
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
302 if (track->encodings[i].comp_algo == 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
303 /* zlib encoded track */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
304 z_stream zstream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
305
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
306 zstream.zalloc = (alloc_func) 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
307 zstream.zfree = (free_func) 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
308 zstream.opaque = (voidpf) 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
309 if (inflateInit(&zstream) != Z_OK) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
310 mp_msg(MSGT_DEMUX, MSGL_WARN,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
311 MSGTR_MPDEMUX_MKV_ZlibInitializationFailed);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
312 return modified;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
313 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
314 zstream.next_in = (Bytef *) src;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
315 zstream.avail_in = *size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
316
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
317 modified = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
318 *dest = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
319 zstream.avail_out = *size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
320 do {
32224
23ba595c0292 Matroska allows data to be compressed multiple times, thus ensure
reimar
parents: 32223
diff changeset
321 if (*size > SIZE_MAX - 4000 - AV_LZO_INPUT_PADDING)
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
322 goto zlib_fail;
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
323
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
324 *size += 4000;
32224
23ba595c0292 Matroska allows data to be compressed multiple times, thus ensure
reimar
parents: 32223
diff changeset
325 *dest = realloc(*dest, *size + AV_LZO_INPUT_PADDING);
32225
8ebdc8466b2f Check for realloc failure. Ignore the memleak this causes since
reimar
parents: 32224
diff changeset
326 if (!*dest)
8ebdc8466b2f Check for realloc failure. Ignore the memleak this causes since
reimar
parents: 32224
diff changeset
327 goto zlib_fail;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
328 zstream.next_out = (Bytef *) (*dest + zstream.total_out);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
329 result = inflate(&zstream, Z_NO_FLUSH);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
330 if (result != Z_OK && result != Z_STREAM_END) {
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
331 zlib_fail:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
332 mp_msg(MSGT_DEMUX, MSGL_WARN,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
333 MSGTR_MPDEMUX_MKV_ZlibDecompressionFailed);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
334 free(*dest);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
335 *dest = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
336 inflateEnd(&zstream);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
337 return modified;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
338 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
339 zstream.avail_out += 4000;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
340 } while (zstream.avail_out == 4000 && zstream.avail_in != 0
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
341 && result != Z_STREAM_END);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
342
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
343 *size = zstream.total_out;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
344 inflateEnd(&zstream);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
345 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
346 #endif
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
347 if (track->encodings[i].comp_algo == 2) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
348 /* lzo encoded track */
32221
4034fb538bc1 Fix decoded length calculation of LZO decompression in demux_mkv.
reimar
parents: 32220
diff changeset
349 int out_avail;
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
350 int dstlen = *size > SIZE_MAX/3 ? *size : *size * 3;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
351
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
352 *dest = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
353 while (1) {
32224
23ba595c0292 Matroska allows data to be compressed multiple times, thus ensure
reimar
parents: 32223
diff changeset
354 // Max of both because we might decompress the input multiple
23ba595c0292 Matroska allows data to be compressed multiple times, thus ensure
reimar
parents: 32223
diff changeset
355 // times. Makes no sense but is possible.
23ba595c0292 Matroska allows data to be compressed multiple times, thus ensure
reimar
parents: 32223
diff changeset
356 int padding = FFMAX(AV_LZO_OUTPUT_PADDING, AV_LZO_INPUT_PADDING);
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
357 int srclen = *size;
32224
23ba595c0292 Matroska allows data to be compressed multiple times, thus ensure
reimar
parents: 32223
diff changeset
358 if (dstlen > SIZE_MAX - padding)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
359 goto lzo_fail;
32224
23ba595c0292 Matroska allows data to be compressed multiple times, thus ensure
reimar
parents: 32223
diff changeset
360 *dest = realloc(*dest, dstlen + padding);
32225
8ebdc8466b2f Check for realloc failure. Ignore the memleak this causes since
reimar
parents: 32224
diff changeset
361 if (!*dest)
8ebdc8466b2f Check for realloc failure. Ignore the memleak this causes since
reimar
parents: 32224
diff changeset
362 goto lzo_fail;
32221
4034fb538bc1 Fix decoded length calculation of LZO decompression in demux_mkv.
reimar
parents: 32220
diff changeset
363 out_avail = dstlen;
4034fb538bc1 Fix decoded length calculation of LZO decompression in demux_mkv.
reimar
parents: 32220
diff changeset
364 result = av_lzo1x_decode(*dest, &out_avail, src, &srclen);
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
365 if (result == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
366 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
367 if (!(result & AV_LZO_OUTPUT_FULL)) {
32222
bceb1da0fe8f Fix label indentation.
reimar
parents: 32221
diff changeset
368 lzo_fail:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
369 mp_msg(MSGT_DEMUX, MSGL_WARN,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
370 MSGTR_MPDEMUX_MKV_LzoDecompressionFailed);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
371 free(*dest);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
372 *dest = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
373 return modified;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
374 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
375 mp_msg(MSGT_DEMUX, MSGL_DBG2,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
376 "[mkv] lzo decompression buffer too small.\n");
32224
23ba595c0292 Matroska allows data to be compressed multiple times, thus ensure
reimar
parents: 32223
diff changeset
377 if (dstlen > (SIZE_MAX - padding)/2)
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
378 goto lzo_fail;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
379 dstlen *= 2;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
380 }
32221
4034fb538bc1 Fix decoded length calculation of LZO decompression in demux_mkv.
reimar
parents: 32220
diff changeset
381 *size = dstlen - out_avail;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
382 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
383 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
384
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
385 return modified;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
386 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
387
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
388
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
389 static int demux_mkv_read_info(demuxer_t *demuxer)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
390 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
391 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
392 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
393 uint64_t length, l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
394 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
395 uint64_t tc_scale = 1000000;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
396 long double duration = 0.;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
397
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
398 length = ebml_read_length(s, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
399 while (length > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
400 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
401 case MATROSKA_ID_TIMECODESCALE:
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
402 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
403 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
404 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
405 return 1;
19809
99d375aab4db Fix movie duration calculation in case when TimecodeScale element comes after
eugeni
parents: 19645
diff changeset
406 tc_scale = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
407 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
408 "[mkv] | + timecode scale: %" PRIu64 "\n", tc_scale);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
409 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
410 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
411
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
412 case MATROSKA_ID_DURATION:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
413 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
414 long double num = ebml_read_float(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
415 if (num == EBML_FLOAT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
416 return 1;
19809
99d375aab4db Fix movie duration calculation in case when TimecodeScale element comes after
eugeni
parents: 19645
diff changeset
417 duration = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
418 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + duration: %.3Lfs\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
419 duration * tc_scale / 1000000000.0);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
420 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
421 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
422
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
423 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
424 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
425 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
426 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
427 length -= l + il;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
428 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
429 mkv_d->tc_scale = tc_scale;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
430 mkv_d->duration = duration * tc_scale / 1000000000.0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
431 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
432 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
433
20133
6d6c0840113f Free track encodings on error or demuxer close
reimar
parents: 20130
diff changeset
434 /**
6d6c0840113f Free track encodings on error or demuxer close
reimar
parents: 20130
diff changeset
435 * \brief free array of kv_content_encoding_t
6d6c0840113f Free track encodings on error or demuxer close
reimar
parents: 20130
diff changeset
436 * \param encodings pointer to array
6d6c0840113f Free track encodings on error or demuxer close
reimar
parents: 20130
diff changeset
437 * \param numencodings number of encodings in array
6d6c0840113f Free track encodings on error or demuxer close
reimar
parents: 20130
diff changeset
438 */
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
439 static void demux_mkv_free_encodings(mkv_content_encoding_t *encodings,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
440 int numencodings)
20133
6d6c0840113f Free track encodings on error or demuxer close
reimar
parents: 20130
diff changeset
441 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
442 while (numencodings-- > 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
443 free(encodings[numencodings].comp_settings);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
444 free(encodings);
20133
6d6c0840113f Free track encodings on error or demuxer close
reimar
parents: 20130
diff changeset
445 }
6d6c0840113f Free track encodings on error or demuxer close
reimar
parents: 20130
diff changeset
446
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
447 static int demux_mkv_read_trackencodings(demuxer_t *demuxer,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
448 mkv_track_t *track)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
449 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
450 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
451 mkv_content_encoding_t *ce, e;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
452 uint64_t len, length, l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
453 int il, n;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
454
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
455 ce = malloc(sizeof(*ce));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
456 n = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
457
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
458 len = length = ebml_read_length(s, &il);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
459 len += il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
460 while (length > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
461 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
462 case MATROSKA_ID_CONTENTENCODING:
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
463 {
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
464 uint64_t len;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
465 int i;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
466
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
467 memset(&e, 0, sizeof(e));
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
468 e.scope = 1;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
469
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
470 len = ebml_read_length(s, &i);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
471 l = len + i;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
472
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
473 while (len > 0) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
474 uint64_t num, l;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
475 int il;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
476
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
477 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
478 case MATROSKA_ID_CONTENTENCODINGORDER:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
479 num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
480 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
481 goto err_out;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
482 e.order = num;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
483 break;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
484
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
485 case MATROSKA_ID_CONTENTENCODINGSCOPE:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
486 num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
487 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
488 goto err_out;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
489 e.scope = num;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
490 break;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
491
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
492 case MATROSKA_ID_CONTENTENCODINGTYPE:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
493 num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
494 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
495 goto err_out;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
496 e.type = num;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
497 break;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
498
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
499 case MATROSKA_ID_CONTENTCOMPRESSION:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
500 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
501 uint64_t le;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
502
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
503 le = ebml_read_length(s, &i);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
504 l = le + i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
505
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
506 while (le > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
507 uint64_t l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
508 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
509
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
510 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
511 case MATROSKA_ID_CONTENTCOMPALGO:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
512 num = ebml_read_uint(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
513 if (num == EBML_UINT_INVALID)
20133
6d6c0840113f Free track encodings on error or demuxer close
reimar
parents: 20130
diff changeset
514 goto err_out;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
515 e.comp_algo = num;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
516 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
517
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
518 case MATROSKA_ID_CONTENTCOMPSETTINGS:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
519 l = ebml_read_length(s, &i);
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
520 if (l > SIZE_MAX)
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
521 goto err_out;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
522 e.comp_settings = malloc(l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
523 stream_read(s, e.comp_settings, l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
524 e.comp_settings_len = l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
525 l += i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
526 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
527
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
528 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
529 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
530 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
531 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
532 le -= l + il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
533 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
534
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
535 if (e.type == 1) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
536 mp_msg(MSGT_DEMUX, MSGL_WARN,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
537 MSGTR_MPDEMUX_MKV_TrackEncrypted,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
538 track->tnum);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
539 } else if (e.type != 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
540 mp_msg(MSGT_DEMUX, MSGL_WARN,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
541 MSGTR_MPDEMUX_MKV_UnknownContentEncoding,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
542 track->tnum);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
543 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
544
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
545 if (e.comp_algo != 0 && e.comp_algo != 2) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
546 mp_msg(MSGT_DEMUX, MSGL_WARN,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
547 MSGTR_MPDEMUX_MKV_UnknownCompression,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
548 track->tnum, e.comp_algo);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
549 }
28440
2218218264cb Convert CONFIG_ZLIB into a 0/1 option.
diego
parents: 28413
diff changeset
550 #if !CONFIG_ZLIB
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
551 else if (e.comp_algo == 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
552 mp_msg(MSGT_DEMUX, MSGL_WARN,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
553 MSGTR_MPDEMUX_MKV_ZlibCompressionUnsupported,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
554 track->tnum);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
555 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
556 #endif
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
557
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
558 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
559 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
560
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
561 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
562 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
563 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
564 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
565 len -= l + il;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
566 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
567 for (i = 0; i < n; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
568 if (e.order <= ce[i].order)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
569 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
570 ce = realloc(ce, (n + 1) * sizeof(*ce));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
571 memmove(ce + i + 1, ce + i, (n - i) * sizeof(*ce));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
572 memcpy(ce + i, &e, sizeof(e));
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
573 n++;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
574 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
575 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
576
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
577 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
578 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
579 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
580 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
581
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
582 length -= l + il;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
583 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
584
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
585 track->encodings = ce;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
586 track->num_encodings = n;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
587 return len;
20133
6d6c0840113f Free track encodings on error or demuxer close
reimar
parents: 20130
diff changeset
588
6d6c0840113f Free track encodings on error or demuxer close
reimar
parents: 20130
diff changeset
589 err_out:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
590 demux_mkv_free_encodings(ce, n);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
591 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
592 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
593
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
594 static int demux_mkv_read_trackaudio(demuxer_t *demuxer, mkv_track_t *track)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
595 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
596 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
597 uint64_t len, length, l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
598 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
599
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
600 track->a_sfreq = 8000.0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
601 track->a_channels = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
602
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
603 len = length = ebml_read_length(s, &il);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
604 len += il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
605 while (length > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
606 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
607 case MATROSKA_ID_AUDIOSAMPLINGFREQ:
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
608 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
609 long double num = ebml_read_float(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
610 if (num == EBML_FLOAT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
611 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
612 track->a_sfreq = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
613 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
614 "[mkv] | + Sampling frequency: %f\n", track->a_sfreq);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
615 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
616 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
617
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
618 case MATROSKA_ID_AUDIOBITDEPTH:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
619 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
620 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
621 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
622 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
623 track->a_bps = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
624 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Bit depth: %u\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
625 track->a_bps);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
626 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
627 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
628
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
629 case MATROSKA_ID_AUDIOCHANNELS:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
630 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
631 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
632 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
633 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
634 track->a_channels = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
635 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Channels: %u\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
636 track->a_channels);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
637 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
638 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
639
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
640 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
641 ebml_read_skip(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
642 break;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
643 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
644 length -= l + il;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
645 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
646 return len;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
647 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
648
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
649 static int demux_mkv_read_trackvideo(demuxer_t *demuxer, mkv_track_t *track)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
650 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
651 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
652 uint64_t len, length, l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
653 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
654
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
655 len = length = ebml_read_length(s, &il);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
656 len += il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
657 while (length > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
658 switch (ebml_read_id(s, &il)) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
659 case MATROSKA_ID_VIDEOFRAMERATE:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
660 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
661 long double num = ebml_read_float(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
662 if (num == EBML_FLOAT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
663 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
664 track->v_frate = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
665 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Frame rate: %f\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
666 track->v_frate);
14058
4dee22ed8608 Make use of the default duration for one frame if it is present in the file. This produces much smoother timecodes for laced audio frames. And I REALLY don't know why I missed that before...
mosu
parents: 14054
diff changeset
667 if (track->v_frate > 0)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
668 track->default_duration = 1 / track->v_frate;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
669 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
670 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
671
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
672 case MATROSKA_ID_VIDEODISPLAYWIDTH:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
673 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
674 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
675 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
676 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
677 track->v_dwidth = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
678 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display width: %u\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
679 track->v_dwidth);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
680 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
681 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
682
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
683 case MATROSKA_ID_VIDEODISPLAYHEIGHT:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
684 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
685 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
686 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
687 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
688 track->v_dheight = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
689 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Display height: %u\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
690 track->v_dheight);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
691 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
692 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
693
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
694 case MATROSKA_ID_VIDEOPIXELWIDTH:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
695 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
696 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
697 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
698 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
699 track->v_width = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
700 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel width: %u\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
701 track->v_width);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
702 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
703 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
704
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
705 case MATROSKA_ID_VIDEOPIXELHEIGHT:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
706 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
707 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
708 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
709 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
710 track->v_height = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
711 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Pixel height: %u\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
712 track->v_height);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
713 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
714 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
715
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
716 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
717 ebml_read_skip(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
718 break;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
719 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
720 length -= l + il;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
721 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
722 return len;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
723 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
724
20135
7079d029d27c Free track data if error occurs while reading trackentry
reimar
parents: 20133
diff changeset
725 /**
7079d029d27c Free track data if error occurs while reading trackentry
reimar
parents: 20133
diff changeset
726 * \brief free any data associated with given track
7079d029d27c Free track data if error occurs while reading trackentry
reimar
parents: 20133
diff changeset
727 * \param track track of which to free data
7079d029d27c Free track data if error occurs while reading trackentry
reimar
parents: 20133
diff changeset
728 */
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
729 static void demux_mkv_free_trackentry(mkv_track_t *track)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
730 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
731 free(track->name);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
732 free(track->codec_id);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
733 free(track->language);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
734 free(track->private_data);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
735 free(track->audio_buf);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
736 free(track->audio_timestamp);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
737 demux_mkv_free_encodings(track->encodings, track->num_encodings);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
738 free(track);
20135
7079d029d27c Free track data if error occurs while reading trackentry
reimar
parents: 20133
diff changeset
739 }
7079d029d27c Free track data if error occurs while reading trackentry
reimar
parents: 20133
diff changeset
740
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
741 static int demux_mkv_read_trackentry(demuxer_t *demuxer)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
742 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
743 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
744 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
745 mkv_track_t *track;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
746 uint64_t len, length, l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
747 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
748
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
749 track = calloc(1, sizeof(*track));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
750 /* set default values */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
751 track->default_track = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
752 track->name = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
753 track->language = strdup("eng");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
754
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
755 len = length = ebml_read_length(s, &il);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
756 len += il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
757 while (length > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
758 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
759 case MATROSKA_ID_TRACKNUMBER:
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
760 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
761 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
762 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
763 goto err_out;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
764 track->tnum = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
765 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track number: %u\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
766 track->tnum);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
767 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
768 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
769
19640
521f71200591 Display track names in matroska files.
eugeni
parents: 19621
diff changeset
770 case MATROSKA_ID_TRACKNAME:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
771 track->name = ebml_read_utf8(s, &l);
19640
521f71200591 Display track names in matroska files.
eugeni
parents: 19621
diff changeset
772 if (track->name == NULL)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
773 goto err_out;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
774 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Name: %s\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
775 track->name);
19640
521f71200591 Display track names in matroska files.
eugeni
parents: 19621
diff changeset
776 break;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
777
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
778 case MATROSKA_ID_TRACKTYPE:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
779 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
780 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
781 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
782 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
783 track->type = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
784 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Track type: ");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
785 switch (track->type) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
786 case MATROSKA_TRACK_AUDIO:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
787 mp_msg(MSGT_DEMUX, MSGL_V, "Audio\n");
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
788 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
789 case MATROSKA_TRACK_VIDEO:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
790 mp_msg(MSGT_DEMUX, MSGL_V, "Video\n");
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
791 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
792 case MATROSKA_TRACK_SUBTITLE:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
793 mp_msg(MSGT_DEMUX, MSGL_V, "Subtitle\n");
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
794 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
795 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
796 mp_msg(MSGT_DEMUX, MSGL_V, "unknown\n");
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
797 break;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
798 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
799 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
800 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
801
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
802 case MATROSKA_ID_TRACKAUDIO:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
803 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Audio track\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
804 l = demux_mkv_read_trackaudio(demuxer, track);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
805 if (l == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
806 goto err_out;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
807 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
808
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
809 case MATROSKA_ID_TRACKVIDEO:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
810 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Video track\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
811 l = demux_mkv_read_trackvideo(demuxer, track);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
812 if (l == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
813 goto err_out;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
814 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
815
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
816 case MATROSKA_ID_CODECID:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
817 track->codec_id = ebml_read_ascii(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
818 if (track->codec_id == NULL)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
819 goto err_out;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
820 if (!strcmp(track->codec_id, MKV_V_MSCOMP)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
821 || !strcmp(track->codec_id, MKV_A_ACM))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
822 track->ms_compat = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
823 else if (!strcmp(track->codec_id, MKV_S_VOBSUB))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
824 track->subtitle_type = MATROSKA_SUBTYPE_VOBSUB;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
825 else if (!strcmp(track->codec_id, MKV_S_TEXTSSA)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
826 || !strcmp(track->codec_id, MKV_S_TEXTASS)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
827 || !strcmp(track->codec_id, MKV_S_SSA)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
828 || !strcmp(track->codec_id, MKV_S_ASS)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
829 track->subtitle_type = MATROSKA_SUBTYPE_SSA;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
830 } else if (!strcmp(track->codec_id, MKV_S_TEXTASCII))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
831 track->subtitle_type = MATROSKA_SUBTYPE_TEXT;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
832 if (!strcmp(track->codec_id, MKV_S_TEXTUTF8)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
833 track->subtitle_type = MATROSKA_SUBTYPE_TEXT;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
834 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
835 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Codec ID: %s\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
836 track->codec_id);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
837 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
838
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
839 case MATROSKA_ID_CODECPRIVATE:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
840 {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
841 int x;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
842 uint64_t num = ebml_read_length(s, &x);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
843 // audit: cheap guard against overflows later..
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
844 if (num > SIZE_MAX - 1000)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
845 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
846 l = x + num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
847 track->private_data = malloc(num + AV_LZO_INPUT_PADDING);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
848 if (stream_read(s, track->private_data, num) != (int) num)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
849 goto err_out;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
850 track->private_size = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
851 mp_msg(MSGT_DEMUX, MSGL_V,
32223
c6e682837c8a Fix format string to match type.
reimar
parents: 32222
diff changeset
852 "[mkv] | + CodecPrivate, length " "%zu\n",
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
853 track->private_size);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
854 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
855 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
856
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
857 case MATROSKA_ID_TRACKLANGUAGE:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
858 free(track->language);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
859 track->language = ebml_read_utf8(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
860 if (track->language == NULL)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
861 goto err_out;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
862 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Language: %s\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
863 track->language);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
864 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
865
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
866 case MATROSKA_ID_TRACKFLAGDEFAULT:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
867 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
868 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
869 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
870 goto err_out;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
871 track->default_track = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
872 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + Default flag: %u\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
873 track->default_track);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
874 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
875 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
876
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
877 case MATROSKA_ID_TRACKDEFAULTDURATION:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
878 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
879 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
880 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
881 goto err_out;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
882 if (num == 0)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
883 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
884 "[mkv] | + Default duration: 0");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
885 else {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
886 track->v_frate = 1000000000.0 / num;
14058
4dee22ed8608 Make use of the default duration for one frame if it is present in the file. This produces much smoother timecodes for laced audio frames. And I REALLY don't know why I missed that before...
mosu
parents: 14054
diff changeset
887 track->default_duration = num / 1000000000.0;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
888 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
889 "[mkv] | + Default duration: "
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
890 "%.3fms ( = %.3f fps)\n", num / 1000000.0,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
891 track->v_frate);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
892 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
893 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
894 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
895
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
896 case MATROSKA_ID_TRACKENCODINGS:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
897 l = demux_mkv_read_trackencodings(demuxer, track);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
898 if (l == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
899 goto err_out;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
900 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
901
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
902 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
903 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
904 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
905 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
906 length -= l + il;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
907 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
908
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
909 mkv_d->tracks[mkv_d->num_tracks++] = track;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
910 return len;
20135
7079d029d27c Free track data if error occurs while reading trackentry
reimar
parents: 20133
diff changeset
911
7079d029d27c Free track data if error occurs while reading trackentry
reimar
parents: 20133
diff changeset
912 err_out:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
913 demux_mkv_free_trackentry(track);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
914 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
915 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
916
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
917 static int demux_mkv_read_tracks(demuxer_t *demuxer)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
918 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
919 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
920 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
921 uint64_t length, l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
922 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
923
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
924 mkv_d->tracks = malloc(sizeof(*mkv_d->tracks));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
925 mkv_d->num_tracks = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
926
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
927 length = ebml_read_length(s, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
928 while (length > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
929 switch (ebml_read_id(s, &il)) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
930 case MATROSKA_ID_TRACKENTRY:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
931 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + a track...\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
932 mkv_d->tracks = realloc(mkv_d->tracks, (mkv_d->num_tracks + 1)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
933 * sizeof(*mkv_d->tracks));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
934 l = demux_mkv_read_trackentry(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
935 if (l == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
936 return 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
937 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
938
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
939 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
940 ebml_read_skip(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
941 break;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
942 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
943 length -= l + il;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
944 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
945 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
946 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
947
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
948 static int demux_mkv_read_cues(demuxer_t *demuxer)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
949 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
950 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
951 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
952 uint64_t length, l, time, track, pos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
953 off_t off;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
954 int i, il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
955
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
956 if (index_mode == 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
957 ebml_read_skip(s, NULL);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
958 return 0;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
959 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
960 off = stream_tell(s);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
961 for (i = 0; i < mkv_d->parsed_cues_num; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
962 if (mkv_d->parsed_cues[i] == off) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
963 ebml_read_skip(s, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
964 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
965 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
966 mkv_d->parsed_cues = realloc(mkv_d->parsed_cues,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
967 (mkv_d->parsed_cues_num + 1) * sizeof(off_t));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
968 mkv_d->parsed_cues[mkv_d->parsed_cues_num++] = off;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
969
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
970 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing cues ] -----------\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
971 length = ebml_read_length(s, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
972
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
973 while (length > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
974 time = track = pos = EBML_UINT_INVALID;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
975
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
976 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
977 case MATROSKA_ID_POINTENTRY:
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
978 {
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
979 uint64_t len;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
980
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
981 len = ebml_read_length(s, &i);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
982 l = len + i;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
983
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
984 while (len > 0) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
985 uint64_t l;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
986 int il;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
987
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
988 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
989 case MATROSKA_ID_CUETIME:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
990 time = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
991 break;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
992
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
993 case MATROSKA_ID_CUETRACKPOSITION:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
994 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
995 uint64_t le;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
996
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
997 le = ebml_read_length(s, &i);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
998 l = le + i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
999
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1000 while (le > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1001 uint64_t l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1002 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1003
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1004 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1005 case MATROSKA_ID_CUETRACK:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1006 track = ebml_read_uint(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1007 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1008
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1009 case MATROSKA_ID_CUECLUSTERPOSITION:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1010 pos = ebml_read_uint(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1011 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1012
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1013 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1014 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1015 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1016 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1017 le -= l + il;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1018 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1019 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1020 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1021
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1022 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1023 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1024 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1025 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1026 len -= l + il;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1027 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1028 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1029 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1030
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1031 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1032 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1033 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1034 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1035
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1036 length -= l + il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1037
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1038 if (time != EBML_UINT_INVALID && track != EBML_UINT_INVALID
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1039 && pos != EBML_UINT_INVALID) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1040 grow_array(&mkv_d->indexes, mkv_d->num_indexes,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1041 sizeof(mkv_index_t));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1042 if (!mkv_d->indexes) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1043 mkv_d->num_indexes = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1044 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1045 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1046 mkv_d->indexes[mkv_d->num_indexes].tnum = track;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1047 mkv_d->indexes[mkv_d->num_indexes].timecode = time;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1048 mkv_d->indexes[mkv_d->num_indexes].filepos = mkv_d->segment_start
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1049 + pos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1050 mp_msg(MSGT_DEMUX, MSGL_DBG2,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1051 "[mkv] |+ found cue point " "for track %" PRIu64
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1052 ": timecode %" PRIu64 ", filepos: %" PRIu64 "\n", track,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1053 time, mkv_d->segment_start + pos);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1054 mkv_d->num_indexes++;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1055 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1056 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1057
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1058 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] \\---- [ parsing cues ] -----------\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1059 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1060 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1061
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1062 static int demux_mkv_read_chapters(demuxer_t *demuxer)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1063 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1064 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1065 uint64_t length, l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1066 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1067
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1068 if (demuxer->chapters) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1069 ebml_read_skip(s, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1070 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1071 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1072
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1073 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] /---- [ parsing chapters ] ---------\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1074 length = ebml_read_length(s, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1075
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1076 while (length > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1077 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1078 case MATROSKA_ID_EDITIONENTRY:
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1079 {
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1080 uint64_t len;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1081 int i;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1082
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1083 len = ebml_read_length(s, &i);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1084 l = len + i;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1085
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1086 while (len > 0) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1087 uint64_t l;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1088 int il;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1089
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1090 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1091 case MATROSKA_ID_CHAPTERATOM:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1092 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1093 uint64_t len, start = 0, end = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1094 char *name = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1095 int i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1096 int cid;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1097
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1098 len = ebml_read_length(s, &i);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1099 l = len + i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1100
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1101 while (len > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1102 uint64_t l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1103 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1104
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1105 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1106 case MATROSKA_ID_CHAPTERTIMESTART:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1107 start = ebml_read_uint(s, &l) / 1000000;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1108 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1109
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1110 case MATROSKA_ID_CHAPTERTIMEEND:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1111 end = ebml_read_uint(s, &l) / 1000000;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1112 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1113
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1114 case MATROSKA_ID_CHAPTERDISPLAY:
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1115 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1116 uint64_t len;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1117 int i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1118
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1119 len = ebml_read_length(s, &i);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1120 l = len + i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1121 while (len > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1122 uint64_t l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1123 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1124
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1125 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1126 case MATROSKA_ID_CHAPSTRING:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1127 name = ebml_read_utf8(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1128 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1129 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1130 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1131 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1132 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1133 len -= l + il;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1134 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1135 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1136 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1137
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1138 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1139 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1140 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1141 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1142 len -= l + il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1143 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1144
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1145 if (!name)
19342
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19154
diff changeset
1146 name = strdup("(unnamed)");
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1147
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1148 cid = demuxer_add_chapter(demuxer, name, start, end);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1149
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1150 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1151 "[mkv] Chapter %u from %02d:%02d:%02d."
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1152 "%03d to %02d:%02d:%02d.%03d, %s\n", cid,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1153 (int) (start / 60 / 60 / 1000),
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1154 (int) ((start / 60 / 1000) % 60),
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1155 (int) ((start / 1000) % 60),
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1156 (int) (start % 1000),
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1157 (int) (end / 60 / 60 / 1000),
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1158 (int) ((end / 60 / 1000) % 60),
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1159 (int) ((end / 1000) % 60),
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1160 (int) (end % 1000), name);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1161
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1162 free(name);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1163 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1164 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1165
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1166 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1167 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1168 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1169 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1170 len -= l + il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1171 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1172 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1173 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1174
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1175 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1176 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1177 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1178 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1179
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1180 length -= l + il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1181 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1182
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1183 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1184 "[mkv] \\---- [ parsing chapters ] ---------\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1185 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1186 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1187
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1188 static int demux_mkv_read_tags(demuxer_t *demuxer)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1189 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1190 ebml_read_skip(demuxer->stream, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1191 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1192 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1193
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1194 static int demux_mkv_read_attachments(demuxer_t *demuxer)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1195 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1196 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1197 uint64_t length, l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1198 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1199
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1200 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1201 "[mkv] /---- [ parsing attachments ] ---------\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1202 length = ebml_read_length(s, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1203
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1204 while (length > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1205 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1206 case MATROSKA_ID_ATTACHEDFILE:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1207 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1208 uint64_t len;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1209 int i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1210 char *name = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1211 char *mime = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1212 char *data = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1213 int data_size = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1214
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1215 len = ebml_read_length(s, &i);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1216 l = len + i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1217
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1218 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + an attachment...\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1219
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1220 while (len > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1221 uint64_t l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1222 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1223
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1224 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1225 case MATROSKA_ID_FILENAME:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1226 name = ebml_read_utf8(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1227 if (name == NULL)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1228 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1229 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] | + FileName: %s\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1230 name);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1231 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1232
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1233 case MATROSKA_ID_FILEMIMETYPE:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1234 mime = ebml_read_ascii(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1235 if (mime == NULL)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1236 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1237 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1238 "[mkv] | + FileMimeType: %s\n", mime);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1239 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1240
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1241 case MATROSKA_ID_FILEDATA:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1242 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1243 int x;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1244 uint64_t num = ebml_read_length(s, &x);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1245 l = x + num;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1246 free(data);
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1247 if (num > SIZE_MAX)
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1248 return 0;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1249 data = malloc(num);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1250 if (stream_read(s, data, num) != (int) num) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1251 free(data);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1252 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1253 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1254 data_size = num;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1255 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1256 "[mkv] | + FileData, length " "%u\n",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1257 data_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1258 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1259 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1260
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1261 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1262 ebml_read_skip(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1263 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1264 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1265 len -= l + il;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1266 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1267
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1268 demuxer_add_attachment(demuxer, name, mime, data, data_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1269 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1270 "[mkv] Attachment: %s, %s, %u bytes\n", name, mime,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1271 data_size);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1272 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1273 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1274
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1275 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1276 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1277 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1278 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1279 length -= l + il;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1280 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1281
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1282 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1283 "[mkv] \\---- [ parsing attachments ] ---------\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1284 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1285 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1286
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1287 static int demux_mkv_read_seekhead(demuxer_t *demuxer)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1288 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1289 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1290 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1291 uint64_t length, l, seek_pos, saved_pos, num;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1292 uint32_t seek_id;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1293 int i, il, res = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1294 off_t off;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1295
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1296 off = stream_tell(s);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1297 for (i = 0; i < mkv_d->parsed_seekhead_num; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1298 if (mkv_d->parsed_seekhead[i] == off) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1299 ebml_read_skip(s, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1300 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1301 }
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1302 if (mkv_d->parsed_seekhead_num >= INT_MAX ||
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1303 mkv_d->parsed_seekhead_num > SIZE_MAX/sizeof(off_t))
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1304 return 0;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1305 mkv_d->parsed_seekhead = realloc(mkv_d->parsed_seekhead,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1306 (mkv_d->parsed_seekhead_num + 1)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1307 * sizeof(off_t));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1308 mkv_d->parsed_seekhead[mkv_d->parsed_seekhead_num++] = off;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1309
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1310 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1311 "[mkv] /---- [ parsing seek head ] ---------\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1312 length = ebml_read_length(s, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1313 /* off now holds the position of the next element after the seek head. */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1314 off = stream_tell(s) + length;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1315 while (length > 0 && !res) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1316
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1317 seek_id = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1318 seek_pos = EBML_UINT_INVALID;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1319
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1320 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1321 case MATROSKA_ID_SEEKENTRY:
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents: 18934
diff changeset
1322 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1323 uint64_t len;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1324
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1325 len = ebml_read_length(s, &i);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1326 l = len + i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1327
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1328 while (len > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1329 uint64_t l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1330 int il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1331
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1332 switch (ebml_read_id(s, &il)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1333 case MATROSKA_ID_SEEKID:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1334 num = ebml_read_uint(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1335 if (num != EBML_UINT_INVALID)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1336 seek_id = num;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1337 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1338
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1339 case MATROSKA_ID_SEEKPOSITION:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1340 seek_pos = ebml_read_uint(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1341 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1342
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1343 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1344 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1345 break;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents: 18934
diff changeset
1346 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1347 len -= l + il;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents: 18934
diff changeset
1348 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents: 18934
diff changeset
1349
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1350 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1351 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1352
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1353 default:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1354 ebml_read_skip(s, &l);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents: 18934
diff changeset
1355 break;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents: 18934
diff changeset
1356 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1357 length -= l + il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1358
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1359 if (seek_id == 0 || seek_id == MATROSKA_ID_CLUSTER
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1360 || seek_pos == EBML_UINT_INVALID
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1361 || ((mkv_d->segment_start + seek_pos) >=
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1362 (uint64_t) demuxer->movi_end))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1363 continue;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1364
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1365 saved_pos = stream_tell(s);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1366 if (!stream_seek(s, mkv_d->segment_start + seek_pos))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1367 res = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1368 else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1369 if (ebml_read_id(s, &il) != seek_id)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1370 res = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1371 else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1372 switch (seek_id) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1373 case MATROSKA_ID_CUES:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1374 if (demux_mkv_read_cues(demuxer))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1375 res = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1376 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1377
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1378 case MATROSKA_ID_TAGS:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1379 if (demux_mkv_read_tags(demuxer))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1380 res = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1381 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1382
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1383 case MATROSKA_ID_SEEKHEAD:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1384 if (demux_mkv_read_seekhead(demuxer))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1385 res = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1386 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1387
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1388 case MATROSKA_ID_CHAPTERS:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1389 if (demux_mkv_read_chapters(demuxer))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1390 res = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1391 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1392 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1393 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1394
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1395 stream_seek(s, saved_pos);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents: 18934
diff changeset
1396 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1397 if (res) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1398 /* If there was an error then try to skip this seek head. */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1399 if (stream_seek(s, off))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1400 res = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1401 } else if (length > 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1402 stream_seek(s, stream_tell(s) + length);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1403 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1404 "[mkv] \\---- [ parsing seek head ] ---------\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1405 return res;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents: 18934
diff changeset
1406 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents: 18934
diff changeset
1407
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1408 static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1409 int vid);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1410 static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1411 int aid);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1412 static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1413 int sid);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1414
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1415 static void display_create_tracks(demuxer_t *demuxer)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1416 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1417 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1418 int i, vid = 0, aid = 0, sid = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1419
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1420 for (i = 0; i < mkv_d->num_tracks; i++) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1421 char *type = "unknown", str[32];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1422 *str = '\0';
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1423 switch (mkv_d->tracks[i]->type) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1424 case MATROSKA_TRACK_VIDEO:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1425 type = "video";
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1426 demux_mkv_open_video(demuxer, mkv_d->tracks[i], vid);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1427 if (mkv_d->tracks[i]->name)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1428 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VID_%d_NAME=%s\n", vid,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1429 mkv_d->tracks[i]->name);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1430 sprintf(str, "-vid %u", vid++);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1431 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1432 case MATROSKA_TRACK_AUDIO:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1433 type = "audio";
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1434 demux_mkv_open_audio(demuxer, mkv_d->tracks[i], aid);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1435 if (mkv_d->tracks[i]->name)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1436 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AID_%d_NAME=%s\n", aid,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1437 mkv_d->tracks[i]->name);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1438 sprintf(str, "-aid %u, -alang %.5s", aid++,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1439 mkv_d->tracks[i]->language);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1440 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1441 case MATROSKA_TRACK_SUBTITLE:
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1442 type = "subtitles";
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1443 demux_mkv_open_sub(demuxer, mkv_d->tracks[i], sid);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1444 if (mkv_d->tracks[i]->name)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1445 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_NAME=%s\n", sid,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1446 mkv_d->tracks[i]->name);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1447 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SID_%d_LANG=%s\n", sid,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1448 mkv_d->tracks[i]->language);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1449 sprintf(str, "-sid %u, -slang %.5s", sid++,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1450 mkv_d->tracks[i]->language);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1451 break;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1452 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1453 if (mkv_d->tracks[i]->name)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1454 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_MPDEMUX_MKV_TrackIDName,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1455 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1456 mkv_d->tracks[i]->name, str);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1457 else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1458 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_MPDEMUX_MKV_TrackID,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1459 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1460 str);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1461 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1462 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1463
23270
f094c9256137 Avoid code duplication in mkv demuxer for standard fourcc/extradata handling
reimar
parents: 23187
diff changeset
1464 typedef struct {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1465 char *id;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1466 int fourcc;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1467 int extradata;
23270
f094c9256137 Avoid code duplication in mkv demuxer for standard fourcc/extradata handling
reimar
parents: 23187
diff changeset
1468 } videocodec_info_t;
f094c9256137 Avoid code duplication in mkv demuxer for standard fourcc/extradata handling
reimar
parents: 23187
diff changeset
1469
f094c9256137 Avoid code duplication in mkv demuxer for standard fourcc/extradata handling
reimar
parents: 23187
diff changeset
1470 static const videocodec_info_t vinfo[] = {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1471 {MKV_V_MPEG1, mmioFOURCC('m', 'p', 'g', '1'), 0},
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1472 {MKV_V_MPEG2, mmioFOURCC('m', 'p', 'g', '2'), 0},
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1473 {MKV_V_MPEG4_SP, mmioFOURCC('m', 'p', '4', 'v'), 1},
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1474 {MKV_V_MPEG4_ASP, mmioFOURCC('m', 'p', '4', 'v'), 1},
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1475 {MKV_V_MPEG4_AP, mmioFOURCC('m', 'p', '4', 'v'), 1},
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1476 {MKV_V_MPEG4_AVC, mmioFOURCC('a', 'v', 'c', '1'), 1},
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1477 {MKV_V_THEORA, mmioFOURCC('t', 'h', 'e', 'o'), 1},
31263
6428a4b38763 Add webm/VP8 support to native matroska demuxer.
reimar
parents: 31210
diff changeset
1478 {MKV_V_VP8, mmioFOURCC('V', 'P', '8', '0'), 0},
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1479 {NULL, 0, 0}
23270
f094c9256137 Avoid code duplication in mkv demuxer for standard fourcc/extradata handling
reimar
parents: 23187
diff changeset
1480 };
f094c9256137 Avoid code duplication in mkv demuxer for standard fourcc/extradata handling
reimar
parents: 23187
diff changeset
1481
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1482 static int demux_mkv_open_video(demuxer_t *demuxer, mkv_track_t *track,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1483 int vid)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1484 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1485 BITMAPINFOHEADER *bih;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1486 void *ImageDesc = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1487 sh_video_t *sh_v;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1488
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1489 if (track->ms_compat) { /* MS compatibility mode */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1490 BITMAPINFOHEADER *src;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1491
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1492 if (track->private_data == NULL
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1493 || track->private_size >= INT_MAX - 1000
32111
7c8d240d37a6 Replace sizeof(type)
reimar
parents: 31609
diff changeset
1494 || track->private_size < sizeof(*bih))
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1495 return 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1496
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1497 src = (BITMAPINFOHEADER *) track->private_data;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1498 bih = calloc(1, track->private_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1499 bih->biSize = le2me_32(src->biSize);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1500 bih->biWidth = le2me_32(src->biWidth);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1501 bih->biHeight = le2me_32(src->biHeight);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1502 bih->biPlanes = le2me_16(src->biPlanes);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1503 bih->biBitCount = le2me_16(src->biBitCount);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1504 bih->biCompression = le2me_32(src->biCompression);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1505 bih->biSizeImage = le2me_32(src->biSizeImage);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1506 bih->biXPelsPerMeter = le2me_32(src->biXPelsPerMeter);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1507 bih->biYPelsPerMeter = le2me_32(src->biYPelsPerMeter);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1508 bih->biClrUsed = le2me_32(src->biClrUsed);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1509 bih->biClrImportant = le2me_32(src->biClrImportant);
32111
7c8d240d37a6 Replace sizeof(type)
reimar
parents: 31609
diff changeset
1510 memcpy(bih + 1,
7c8d240d37a6 Replace sizeof(type)
reimar
parents: 31609
diff changeset
1511 src + 1,
7c8d240d37a6 Replace sizeof(type)
reimar
parents: 31609
diff changeset
1512 track->private_size - sizeof(*bih));
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1513
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1514 if (track->v_width == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1515 track->v_width = bih->biWidth;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1516 if (track->v_height == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1517 track->v_height = bih->biHeight;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1518 } else {
32111
7c8d240d37a6 Replace sizeof(type)
reimar
parents: 31609
diff changeset
1519 bih = calloc(1, sizeof(*bih));
7c8d240d37a6 Replace sizeof(type)
reimar
parents: 31609
diff changeset
1520 bih->biSize = sizeof(*bih);
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1521 bih->biWidth = track->v_width;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1522 bih->biHeight = track->v_height;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1523 bih->biBitCount = 24;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1524 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount / 8;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1525
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1526 if (track->private_size >= RVPROPERTIES_SIZE
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1527 && (!strcmp(track->codec_id, MKV_V_REALV10)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1528 || !strcmp(track->codec_id, MKV_V_REALV20)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1529 || !strcmp(track->codec_id, MKV_V_REALV30)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1530 || !strcmp(track->codec_id, MKV_V_REALV40))) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1531 unsigned char *dst, *src;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1532 uint32_t type2;
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1533 size_t cnt;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1534
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1535 src = (uint8_t *) track->private_data + RVPROPERTIES_SIZE;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1536
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1537 cnt = track->private_size - RVPROPERTIES_SIZE;
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1538 if (cnt > INT_MAX - sizeof(*bih) - 8) {
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1539 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Integer overflow!\n");
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1540 return 1;
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1541 }
32111
7c8d240d37a6 Replace sizeof(type)
reimar
parents: 31609
diff changeset
1542 bih = realloc(bih, sizeof(*bih) + 8 + cnt);
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1543 bih->biSize = 48 + cnt;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1544 bih->biPlanes = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1545 type2 = AV_RB32(src - 4);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1546 if (type2 == 0x10003000 || type2 == 0x10003001)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1547 bih->biCompression = mmioFOURCC('R', 'V', '1', '3');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1548 else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1549 bih->biCompression =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1550 mmioFOURCC('R', 'V', track->codec_id[9], '0');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1551 dst = (unsigned char *) (bih + 1);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1552 // copy type1 and type2 info from rv properties
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1553 memcpy(dst, src - 8, 8);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1554 stream_read(demuxer->stream, dst + 8, cnt);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1555 track->realmedia = 1;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1556
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 26752
diff changeset
1557 #ifdef CONFIG_QTX_CODECS
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1558 } else if (track->private_size >= sizeof(ImageDescription)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1559 && !strcmp(track->codec_id, MKV_V_QUICKTIME)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1560 ImageDescriptionPtr idesc;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1561
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1562 idesc = (ImageDescriptionPtr) track->private_data;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1563 idesc->idSize = be2me_32(idesc->idSize);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1564 idesc->cType = be2me_32(idesc->cType);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1565 idesc->version = be2me_16(idesc->version);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1566 idesc->revisionLevel = be2me_16(idesc->revisionLevel);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1567 idesc->vendor = be2me_32(idesc->vendor);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1568 idesc->temporalQuality = be2me_32(idesc->temporalQuality);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1569 idesc->spatialQuality = be2me_32(idesc->spatialQuality);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1570 idesc->width = be2me_16(idesc->width);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1571 idesc->height = be2me_16(idesc->height);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1572 idesc->hRes = be2me_32(idesc->hRes);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1573 idesc->vRes = be2me_32(idesc->vRes);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1574 idesc->dataSize = be2me_32(idesc->dataSize);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1575 idesc->frameCount = be2me_16(idesc->frameCount);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1576 idesc->depth = be2me_16(idesc->depth);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1577 idesc->clutID = be2me_16(idesc->clutID);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1578 bih->biPlanes = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1579 bih->biCompression = idesc->cType;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1580 ImageDesc = idesc;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1581 #endif /* CONFIG_QTX_CODECS */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1582
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1583 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1584 const videocodec_info_t *vi = vinfo;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1585 while (vi->id && strcmp(vi->id, track->codec_id))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1586 vi++;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1587 bih->biCompression = vi->fourcc;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1588 if (vi->extradata && track->private_data
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1589 && (track->private_size > 0)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1590 bih->biSize += track->private_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1591 bih = realloc(bih, bih->biSize);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1592 memcpy(bih + 1, track->private_data, track->private_size);
19154
2895b9807ff3 Native MPEG4 SP/ASP/AP support in Matroska.
rathann
parents: 18984
diff changeset
1593 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1594 track->reorder_timecodes = user_correct_pts == 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1595 if (!vi->id) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1596 mp_msg(MSGT_DEMUX, MSGL_WARN, MSGTR_MPDEMUX_MKV_UnknownCodecID,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1597 track->codec_id, track->tnum);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1598 free(bih);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1599 return 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1600 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1601 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1602 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1603
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1604 sh_v = new_sh_video_vid(demuxer, track->tnum, vid);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1605 sh_v->bih = bih;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1606 sh_v->format = sh_v->bih->biCompression;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1607 if (track->v_frate == 0.0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1608 track->v_frate = 25.0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1609 sh_v->fps = track->v_frate;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1610 sh_v->frametime = 1 / track->v_frate;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1611 sh_v->aspect = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1612 if (!track->realmedia) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1613 sh_v->disp_w = track->v_width;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1614 sh_v->disp_h = track->v_height;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1615 if (track->v_dheight)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1616 sh_v->aspect = (float) track->v_dwidth / (float) track->v_dheight;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1617 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1618 // vd_realvid.c will set aspect to disp_w/disp_h and rederive
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1619 // disp_w and disp_h from the RealVideo stream contents returned
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1620 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1621 // the Matroska file then it has already been set to PixelWidth/Height
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1622 // by check_track_information.
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1623 sh_v->disp_w = track->v_dwidth;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1624 sh_v->disp_h = track->v_dheight;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1625 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1626 sh_v->ImageDesc = ImageDesc;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1627 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Aspect: %f\n", sh_v->aspect);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1628
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1629 sh_v->ds = demuxer->video;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1630 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1631 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1632
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1633 static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1634 int aid)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1635 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1636 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 31602
diff changeset
1637 sh_audio_t *sh_a = new_sh_audio_aid(demuxer, track->tnum, aid,
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 31602
diff changeset
1638 track->language);
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1639 demux_packet_t *dp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1640 if (!sh_a)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1641 return 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1642 mkv_d->audio_tracks[mkv_d->last_aid] = track->tnum;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1643
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1644 sh_a->default_track = track->default_track;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1645 sh_a->ds = demuxer->audio;
32111
7c8d240d37a6 Replace sizeof(type)
reimar
parents: 31609
diff changeset
1646 sh_a->wf = malloc(sizeof(*sh_a->wf));
32113
e21b0baab10c Replace several sizeof(WAVEFORMATEX)
reimar
parents: 32112
diff changeset
1647 if (track->ms_compat && (track->private_size >= sizeof(*sh_a->wf))) {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1648 WAVEFORMATEX *wf = (WAVEFORMATEX *) track->private_data;
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1649 if (track->private_size > USHRT_MAX + sizeof(WAVEFORMATEX)) {
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1650 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Integer overflow!\n");
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1651 free_sh_audio(demuxer, track->tnum);
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1652 return 1;
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1653 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1654 sh_a->wf = realloc(sh_a->wf, track->private_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1655 sh_a->wf->wFormatTag = le2me_16(wf->wFormatTag);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1656 sh_a->wf->nChannels = le2me_16(wf->nChannels);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1657 sh_a->wf->nSamplesPerSec = le2me_32(wf->nSamplesPerSec);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1658 sh_a->wf->nAvgBytesPerSec = le2me_32(wf->nAvgBytesPerSec);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1659 sh_a->wf->nBlockAlign = le2me_16(wf->nBlockAlign);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1660 sh_a->wf->wBitsPerSample = le2me_16(wf->wBitsPerSample);
32113
e21b0baab10c Replace several sizeof(WAVEFORMATEX)
reimar
parents: 32112
diff changeset
1661 sh_a->wf->cbSize = track->private_size - sizeof(*sh_a->wf);
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1662 memcpy(sh_a->wf + 1, wf + 1,
32113
e21b0baab10c Replace several sizeof(WAVEFORMATEX)
reimar
parents: 32112
diff changeset
1663 track->private_size - sizeof(*sh_a->wf));
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1664 if (track->a_sfreq == 0.0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1665 track->a_sfreq = sh_a->wf->nSamplesPerSec;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1666 if (track->a_channels == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1667 track->a_channels = sh_a->wf->nChannels;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1668 if (track->a_bps == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1669 track->a_bps = sh_a->wf->wBitsPerSample;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1670 track->a_formattag = sh_a->wf->wFormatTag;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1671 } else {
32113
e21b0baab10c Replace several sizeof(WAVEFORMATEX)
reimar
parents: 32112
diff changeset
1672 memset(sh_a->wf, 0, sizeof(*sh_a->wf));
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1673 if (!strcmp(track->codec_id, MKV_A_MP3)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1674 || !strcmp(track->codec_id, MKV_A_MP2))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1675 track->a_formattag = 0x0055;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1676 else if (!strncmp(track->codec_id, MKV_A_AC3, strlen(MKV_A_AC3)))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1677 track->a_formattag = 0x2000;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1678 else if (!strcmp(track->codec_id, MKV_A_DTS))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1679 track->a_formattag = 0x2001;
33011
e9a733c1e2a1 Support E-AC3 in deprecated native matroska demuxer.
cehoyos
parents: 32467
diff changeset
1680 else if (!strcmp(track->codec_id, MKV_A_EAC3))
e9a733c1e2a1 Support E-AC3 in deprecated native matroska demuxer.
cehoyos
parents: 32467
diff changeset
1681 track->a_formattag = mmioFOURCC('E', 'A', 'C', '3');
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1682 else if (!strcmp(track->codec_id, MKV_A_PCM)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1683 || !strcmp(track->codec_id, MKV_A_PCM_BE))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1684 track->a_formattag = 0x0001;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1685 else if (!strcmp(track->codec_id, MKV_A_AAC_2MAIN)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1686 || !strncmp(track->codec_id, MKV_A_AAC_2LC,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1687 strlen(MKV_A_AAC_2LC))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1688 || !strcmp(track->codec_id, MKV_A_AAC_2SSR)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1689 || !strcmp(track->codec_id, MKV_A_AAC_4MAIN)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1690 || !strncmp(track->codec_id, MKV_A_AAC_4LC,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1691 strlen(MKV_A_AAC_4LC))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1692 || !strcmp(track->codec_id, MKV_A_AAC_4SSR)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1693 || !strcmp(track->codec_id, MKV_A_AAC_4LTP)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1694 || !strcmp(track->codec_id, MKV_A_AAC))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1695 track->a_formattag = mmioFOURCC('M', 'P', '4', 'A');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1696 else if (!strcmp(track->codec_id, MKV_A_VORBIS)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1697 if (track->private_data == NULL)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1698 return 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1699 track->a_formattag = mmioFOURCC('v', 'r', 'b', 's');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1700 } else if (!strcmp(track->codec_id, MKV_A_QDMC))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1701 track->a_formattag = mmioFOURCC('Q', 'D', 'M', 'C');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1702 else if (!strcmp(track->codec_id, MKV_A_QDMC2))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1703 track->a_formattag = mmioFOURCC('Q', 'D', 'M', '2');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1704 else if (!strcmp(track->codec_id, MKV_A_WAVPACK))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1705 track->a_formattag = mmioFOURCC('W', 'V', 'P', 'K');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1706 else if (!strcmp(track->codec_id, MKV_A_TRUEHD))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1707 track->a_formattag = mmioFOURCC('T', 'R', 'H', 'D');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1708 else if (!strcmp(track->codec_id, MKV_A_FLAC)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1709 if (track->private_data == NULL || track->private_size == 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1710 mp_msg(MSGT_DEMUX, MSGL_WARN,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1711 MSGTR_MPDEMUX_MKV_FlacTrackDoesNotContainValidHeaders);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1712 return 1;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1713 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1714 track->a_formattag = mmioFOURCC('f', 'L', 'a', 'C');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1715 } else if (track->private_size >= RAPROPERTIES4_SIZE) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1716 if (!strcmp(track->codec_id, MKV_A_REAL28))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1717 track->a_formattag = mmioFOURCC('2', '8', '_', '8');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1718 else if (!strcmp(track->codec_id, MKV_A_REALATRC))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1719 track->a_formattag = mmioFOURCC('a', 't', 'r', 'c');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1720 else if (!strcmp(track->codec_id, MKV_A_REALCOOK))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1721 track->a_formattag = mmioFOURCC('c', 'o', 'o', 'k');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1722 else if (!strcmp(track->codec_id, MKV_A_REALDNET))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1723 track->a_formattag = mmioFOURCC('d', 'n', 'e', 't');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1724 else if (!strcmp(track->codec_id, MKV_A_REALSIPR))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1725 track->a_formattag = mmioFOURCC('s', 'i', 'p', 'r');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1726 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1727 mp_msg(MSGT_DEMUX, MSGL_WARN, MSGTR_MPDEMUX_MKV_UnknownAudioCodec,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1728 track->codec_id, track->tnum);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1729 free_sh_audio(demuxer, track->tnum);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1730 return 1;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1731 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1732 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1733
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1734 sh_a->format = track->a_formattag;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1735 sh_a->wf->wFormatTag = track->a_formattag;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1736 sh_a->channels = track->a_channels;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1737 sh_a->wf->nChannels = track->a_channels;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1738 sh_a->samplerate = (uint32_t) track->a_sfreq;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1739 sh_a->wf->nSamplesPerSec = (uint32_t) track->a_sfreq;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1740 if (track->a_bps == 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1741 sh_a->samplesize = 2;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1742 sh_a->wf->wBitsPerSample = 16;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1743 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1744 sh_a->samplesize = track->a_bps / 8;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1745 sh_a->wf->wBitsPerSample = track->a_bps;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1746 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1747 if (track->a_formattag == 0x0055) { /* MP3 || MP2 */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1748 sh_a->wf->nAvgBytesPerSec = 16000;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1749 sh_a->wf->nBlockAlign = 1152;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1750 } else if ((track->a_formattag == 0x2000) || /* AC3 */
33011
e9a733c1e2a1 Support E-AC3 in deprecated native matroska demuxer.
cehoyos
parents: 32467
diff changeset
1751 (track->a_formattag == mmioFOURCC('E', 'A', 'C', '3')) ||
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1752 (track->a_formattag == 0x2001)) { /* DTS */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1753 free(sh_a->wf);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1754 sh_a->wf = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1755 } else if (track->a_formattag == 0x0001) { /* PCM || PCM_BE */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1756 sh_a->wf->nAvgBytesPerSec = sh_a->channels * sh_a->samplerate * 2;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1757 sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1758 if (!strcmp(track->codec_id, MKV_A_PCM_BE))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1759 sh_a->format = mmioFOURCC('t', 'w', 'o', 's');
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1760 } else if (!strcmp(track->codec_id, MKV_A_QDMC)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1761 || !strcmp(track->codec_id, MKV_A_QDMC2)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1762 sh_a->wf->nAvgBytesPerSec = 16000;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1763 sh_a->wf->nBlockAlign = 1486;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1764 track->fix_i_bps = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1765 track->qt_last_a_pts = 0.0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1766 if (track->private_data != NULL) {
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1767 if (track->private_size > INT_MAX) {
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1768 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Integer overflow!\n");
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1769 free_sh_audio(demuxer, track->tnum);
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1770 return 1;
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1771 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1772 sh_a->codecdata = malloc(track->private_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1773 memcpy(sh_a->codecdata, track->private_data, track->private_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1774 sh_a->codecdata_len = track->private_size;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1775 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1776 } else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A')) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1777 int profile, srate_idx;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1778
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1779 sh_a->wf->nAvgBytesPerSec = 16000;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1780 sh_a->wf->nBlockAlign = 1024;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1781
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1782 if (!strcmp(track->codec_id, MKV_A_AAC)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1783 && (NULL != track->private_data)) {
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1784 if (track->private_size > INT_MAX) {
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1785 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Integer overflow!\n");
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1786 free_sh_audio(demuxer, track->tnum);
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1787 return 1;
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1788 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1789 sh_a->codecdata = malloc(track->private_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1790 memcpy(sh_a->codecdata, track->private_data, track->private_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1791 sh_a->codecdata_len = track->private_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1792 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1793 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1794
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1795 /* Recreate the 'private data' */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1796 /* which faad2 uses in its initialization */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1797 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1798 if (!strncmp(&track->codec_id[12], "MAIN", 4))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1799 profile = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1800 else if (!strncmp(&track->codec_id[12], "LC", 2))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1801 profile = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1802 else if (!strncmp(&track->codec_id[12], "SSR", 3))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1803 profile = 2;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1804 else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1805 profile = 3;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1806 sh_a->codecdata = malloc(5);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1807 sh_a->codecdata[0] = ((profile + 1) << 3) | ((srate_idx & 0xE) >> 1);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1808 sh_a->codecdata[1] =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1809 ((srate_idx & 0x1) << 7) | (track->a_channels << 3);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1810
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1811 if (strstr(track->codec_id, "SBR") != NULL) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1812 /* HE-AAC (aka SBR AAC) */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1813 sh_a->codecdata_len = 5;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1814
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1815 sh_a->samplerate *= 2;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1816 sh_a->wf->nSamplesPerSec *= 2;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1817 srate_idx = aac_get_sample_rate_index(sh_a->samplerate);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1818 sh_a->codecdata[2] = AAC_SYNC_EXTENSION_TYPE >> 3;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1819 sh_a->codecdata[3] = ((AAC_SYNC_EXTENSION_TYPE & 0x07) << 5) | 5;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1820 sh_a->codecdata[4] = (1 << 7) | (srate_idx << 3);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1821 track->default_duration = 1024.0 / (sh_a->samplerate / 2);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1822 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1823 sh_a->codecdata_len = 2;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1824 track->default_duration = 1024.0 / (float) sh_a->samplerate;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1825 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1826 } else if (track->a_formattag == mmioFOURCC('v', 'r', 'b', 's')) { /* VORBIS */
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1827 if (track->private_size > USHRT_MAX) {
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1828 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Integer overflow!\n");
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1829 free_sh_audio(demuxer, track->tnum);
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1830 return 1;
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1831 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1832 sh_a->wf->cbSize = track->private_size;
32113
e21b0baab10c Replace several sizeof(WAVEFORMATEX)
reimar
parents: 32112
diff changeset
1833 sh_a->wf = realloc(sh_a->wf, sizeof(*sh_a->wf) + sh_a->wf->cbSize);
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1834 memcpy((unsigned char *) (sh_a->wf + 1), track->private_data,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1835 sh_a->wf->cbSize);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1836 } else if (track->private_size >= RAPROPERTIES4_SIZE
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1837 && !strncmp(track->codec_id, MKV_A_REALATRC, 7)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1838 /* Common initialization for all RealAudio codecs */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1839 unsigned char *src = track->private_data;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1840 int codecdata_length, version;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1841 int flavor;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1842
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1843 sh_a->wf->nAvgBytesPerSec = 0; /* FIXME !? */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1844
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1845 version = AV_RB16(src + 4);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1846 flavor = AV_RB16(src + 22);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1847 track->coded_framesize = AV_RB32(src + 24);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1848 track->sub_packet_h = AV_RB16(src + 40);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1849 sh_a->wf->nBlockAlign = track->audiopk_size = AV_RB16(src + 42);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1850 track->sub_packet_size = AV_RB16(src + 44);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1851 if (version == 4) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1852 src += RAPROPERTIES4_SIZE;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1853 src += src[0] + 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1854 src += src[0] + 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1855 } else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1856 src += RAPROPERTIES5_SIZE;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1857
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1858 src += 3;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1859 if (version == 5)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1860 src++;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1861 codecdata_length = AV_RB32(src);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1862 src += 4;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1863 sh_a->wf->cbSize = codecdata_length;
32113
e21b0baab10c Replace several sizeof(WAVEFORMATEX)
reimar
parents: 32112
diff changeset
1864 sh_a->wf = realloc(sh_a->wf, sizeof(*sh_a->wf) + sh_a->wf->cbSize);
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1865 memcpy(((char *) (sh_a->wf + 1)), src, codecdata_length);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1866
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1867 switch (track->a_formattag) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1868 case mmioFOURCC('a', 't', 'r', 'c'):
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1869 sh_a->wf->nAvgBytesPerSec = atrc_fl2bps[flavor];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1870 sh_a->wf->nBlockAlign = track->sub_packet_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1871 track->audio_buf =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1872 malloc(track->sub_packet_h * track->audiopk_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1873 track->audio_timestamp =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1874 malloc(track->sub_packet_h * sizeof(float));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1875 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1876 case mmioFOURCC('c', 'o', 'o', 'k'):
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1877 sh_a->wf->nAvgBytesPerSec = cook_fl2bps[flavor];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1878 sh_a->wf->nBlockAlign = track->sub_packet_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1879 track->audio_buf =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1880 malloc(track->sub_packet_h * track->audiopk_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1881 track->audio_timestamp =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1882 malloc(track->sub_packet_h * sizeof(float));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1883 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1884 case mmioFOURCC('s', 'i', 'p', 'r'):
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1885 sh_a->wf->nAvgBytesPerSec = sipr_fl2bps[flavor];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1886 sh_a->wf->nBlockAlign = track->coded_framesize;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1887 track->audio_buf =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1888 malloc(track->sub_packet_h * track->audiopk_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1889 track->audio_timestamp =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1890 malloc(track->sub_packet_h * sizeof(float));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1891 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1892 case mmioFOURCC('2', '8', '_', '8'):
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1893 sh_a->wf->nAvgBytesPerSec = 3600;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1894 sh_a->wf->nBlockAlign = track->coded_framesize;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1895 track->audio_buf =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1896 malloc(track->sub_packet_h * track->audiopk_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1897 track->audio_timestamp =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1898 malloc(track->sub_packet_h * sizeof(float));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1899 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1900 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1901
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1902 track->realmedia = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1903 } else if (!strcmp(track->codec_id, MKV_A_FLAC)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1904 || (track->a_formattag == 0xf1ac)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1905 unsigned char *ptr;
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1906 size_t size;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1907 free(sh_a->wf);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1908 sh_a->wf = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1909
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1910 if (track->a_formattag == mmioFOURCC('f', 'L', 'a', 'C')) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1911 ptr = track->private_data;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1912 size = track->private_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1913 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1914 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C');
32113
e21b0baab10c Replace several sizeof(WAVEFORMATEX)
reimar
parents: 32112
diff changeset
1915 ptr = (unsigned char *) track->private_data + sizeof(*sh_a->wf);
e21b0baab10c Replace several sizeof(WAVEFORMATEX)
reimar
parents: 32112
diff changeset
1916 size = track->private_size - sizeof(*sh_a->wf);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1917 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1918 if (size < 4 || ptr[0] != 'f' || ptr[1] != 'L' || ptr[2] != 'a'
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1919 || ptr[3] != 'C') {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1920 dp = new_demux_packet(4);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1921 memcpy(dp->buffer, "fLaC", 4);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1922 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1923 dp = new_demux_packet(size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1924 memcpy(dp->buffer, ptr, size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1925 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1926 dp->pts = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1927 dp->flags = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1928 ds_add_packet(demuxer->audio, dp);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1929 } else if (track->a_formattag == mmioFOURCC('W', 'V', 'P', 'K') ||
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1930 track->a_formattag == mmioFOURCC('T', 'R', 'H', 'D')) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1931 /* do nothing, still works */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1932 } else if (!track->ms_compat
32113
e21b0baab10c Replace several sizeof(WAVEFORMATEX)
reimar
parents: 32112
diff changeset
1933 || (track->private_size < sizeof(*sh_a->wf))) {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1934 free_sh_audio(demuxer, track->tnum);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1935 return 1;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1936 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1937
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1938 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1939 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1940
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1941 static int demux_mkv_open_sub(demuxer_t *demuxer, mkv_track_t *track,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1942 int sid)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1943 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1944 if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN) {
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1945 size_t size;
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1946 int m;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1947 uint8_t *buffer;
31609
cd81fce1f010 Make the stream language an argument to the stream creation function
reimar
parents: 31602
diff changeset
1948 sh_sub_t *sh = new_sh_sub_sid(demuxer, track->tnum, sid, track->language);
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1949 track->sh_sub = sh;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1950 sh->type = 't';
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1951 if (track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1952 sh->type = 'v';
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1953 if (track->subtitle_type == MATROSKA_SUBTYPE_SSA)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1954 sh->type = 'a';
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1955 size = track->private_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1956 m = demux_mkv_decode(track, track->private_data, &buffer, &size, 2);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1957 if (buffer && m) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1958 free(track->private_data);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1959 track->private_data = buffer;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1960 track->private_size = size;
25651
3d5fb36693ac Factorize private data decoding for subtitle tracks in mkv demuxer.
eugeni
parents: 25432
diff changeset
1961 }
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1962 if (track->private_size > INT_MAX) {
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1963 mp_msg(MSGT_DEMUX, MSGL_ERR, "[mkv] Integer overflow!\n");
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1964 return 1;
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
1965 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1966 sh->extradata = malloc(track->private_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1967 memcpy(sh->extradata, track->private_data, track->private_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1968 sh->extradata_len = track->private_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1969 sh->default_track = track->default_track;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1970 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1971 mp_msg(MSGT_DEMUX, MSGL_ERR,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1972 MSGTR_MPDEMUX_MKV_SubtitleTypeNotSupported, track->codec_id);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1973 return 1;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1974 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1975
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1976 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1977 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1978
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1979 static int demux_mkv_open(demuxer_t *demuxer)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1980 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1981 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1982 mkv_demuxer_t *mkv_d;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1983 mkv_track_t *track;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1984 int i, version, cont = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1985 char *str;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1986
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1987 stream_seek(s, s->start_pos);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1988 str = ebml_read_header(s, &version);
31263
6428a4b38763 Add webm/VP8 support to native matroska demuxer.
reimar
parents: 31210
diff changeset
1989 if (str == NULL || (strcmp(str, "matroska") && strcmp(str, "webm")) || version > 2) {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1990 mp_msg(MSGT_DEMUX, MSGL_DBG2, "[mkv] no head found\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1991 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
1992 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1993 free(str);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1994
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1995 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Found the head...\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1996
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1997 if (ebml_read_id(s, NULL) != MATROSKA_ID_SEGMENT) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1998 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] but no segment :(\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
1999 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2000 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2001 ebml_read_length(s, NULL); /* return bytes number until EOF */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2002
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2003 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] + a segment...\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2004
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2005 mkv_d = calloc(1, sizeof(mkv_demuxer_t));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2006 demuxer->priv = mkv_d;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2007 mkv_d->tc_scale = 1000000;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2008 mkv_d->segment_start = stream_tell(s);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2009 mkv_d->parsed_cues = malloc(sizeof(off_t));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2010 mkv_d->parsed_seekhead = malloc(sizeof(off_t));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2011
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2012 while (!cont) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2013 switch (ebml_read_id(s, NULL)) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2014 case MATROSKA_ID_INFO:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2015 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment information...\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2016 cont = demux_mkv_read_info(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2017 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2018
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2019 case MATROSKA_ID_TRACKS:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2020 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] |+ segment tracks...\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2021 cont = demux_mkv_read_tracks(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2022 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2023
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2024 case MATROSKA_ID_CUES:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2025 cont = demux_mkv_read_cues(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2026 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2027
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2028 case MATROSKA_ID_TAGS:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2029 cont = demux_mkv_read_tags(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2030 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2031
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2032 case MATROSKA_ID_SEEKHEAD:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2033 cont = demux_mkv_read_seekhead(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2034 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2035
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2036 case MATROSKA_ID_CHAPTERS:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2037 cont = demux_mkv_read_chapters(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2038 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2039
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents: 18934
diff changeset
2040 case MATROSKA_ID_ATTACHMENTS:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2041 cont = demux_mkv_read_attachments(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2042 break;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents: 18934
diff changeset
2043
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2044 case MATROSKA_ID_CLUSTER:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2045 {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2046 int p, l;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2047 mp_msg(MSGT_DEMUX, MSGL_V,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2048 "[mkv] |+ found cluster, headers are "
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2049 "parsed completely :)\n");
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2050 /* get the first cluster timecode */
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2051 p = stream_tell(s);
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2052 l = ebml_read_length(s, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2053 while (ebml_read_id(s, NULL) != MATROSKA_ID_CLUSTERTIMECODE) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2054 ebml_read_skip(s, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2055 if (stream_tell(s) >= p + l)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2056 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2057 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2058 if (stream_tell(s) < p + l) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2059 uint64_t num = ebml_read_uint(s, NULL);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2060 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2061 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2062 mkv_d->first_tc = num * mkv_d->tc_scale / 1000000.0;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2063 mkv_d->has_first_tc = 1;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2064 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2065 stream_seek(s, p - 4);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2066 cont = 1;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2067 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2068 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2069
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2070 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2071 cont = 1;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2072 case EBML_ID_VOID:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2073 ebml_read_skip(s, NULL);
18754
e0077bdf5ee5 feed any audio track present in the mux; switch to any of the available audio tracks
nicodvb
parents: 18708
diff changeset
2074 break;
e0077bdf5ee5 feed any audio track present in the mux; switch to any of the available audio tracks
nicodvb
parents: 18708
diff changeset
2075 }
e0077bdf5ee5 feed any audio track present in the mux; switch to any of the available audio tracks
nicodvb
parents: 18708
diff changeset
2076 }
e0077bdf5ee5 feed any audio track present in the mux; switch to any of the available audio tracks
nicodvb
parents: 18708
diff changeset
2077
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2078 display_create_tracks(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2079
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2080 /* select video track */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2081 track = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2082 if (demuxer->video->id == -1) { /* automatically select a video track */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2083 /* search for a video track that has the 'default' flag set */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2084 for (i = 0; i < mkv_d->num_tracks; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2085 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2086 && mkv_d->tracks[i]->default_track) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2087 track = mkv_d->tracks[i];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2088 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2089 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2090
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2091 if (track == NULL)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2092 /* no track has the 'default' flag set */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2093 /* let's take the first video track */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2094 for (i = 0; i < mkv_d->num_tracks; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2095 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2096 track = mkv_d->tracks[i];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2097 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2098 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2099 } else if (demuxer->video->id != -2) /* -2 = no video at all */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2100 track = demux_mkv_find_track_by_num(mkv_d, demuxer->video->id,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2101 MATROSKA_TRACK_VIDEO);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2102
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2103 if (track && demuxer->v_streams[track->tnum]) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2104 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_MPDEMUX_MKV_WillPlayVideoTrack,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2105 track->tnum);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2106 demuxer->video->id = track->tnum;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2107 demuxer->video->sh = demuxer->v_streams[track->tnum];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2108 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2109 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_MPDEMUX_MKV_NoVideoTrackFound);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2110 demuxer->video->id = -2;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2111 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2112
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2113 /* select audio track */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2114 track = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2115 if (track == NULL)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2116 /* search for an audio track that has the 'default' flag set */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2117 for (i = 0; i < mkv_d->num_tracks; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2118 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2119 && mkv_d->tracks[i]->default_track) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2120 track = mkv_d->tracks[i];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2121 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2122 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2123
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2124 if (track == NULL)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2125 /* no track has the 'default' flag set */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2126 /* let's take the first audio track */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2127 for (i = 0; i < mkv_d->num_tracks; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2128 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2129 track = mkv_d->tracks[i];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2130 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2131 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2132
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2133 if (track && demuxer->a_streams[track->tnum]) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2134 demuxer->audio->id = track->tnum;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2135 demuxer->audio->sh = demuxer->a_streams[track->tnum];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2136 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2137 mp_msg(MSGT_DEMUX, MSGL_INFO, MSGTR_MPDEMUX_MKV_NoAudioTrackFound);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2138 demuxer->audio->id = -2;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2139 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2140
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2141
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2142 if (demuxer->audio->id != -2)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2143 for (i = 0; i < mkv_d->num_tracks; i++) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2144 if (mkv_d->tracks[i]->type != MATROSKA_TRACK_AUDIO)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2145 continue;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2146 if (demuxer->a_streams[track->tnum]) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2147 mkv_d->last_aid++;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2148 if (mkv_d->last_aid == MAX_A_STREAMS)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2149 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2150 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2151 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2152
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2153 if (demuxer->chapters) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2154 for (i = 0; i < (int) demuxer->num_chapters; i++) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2155 demuxer->chapters[i].start -= mkv_d->first_tc;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2156 demuxer->chapters[i].end -= mkv_d->first_tc;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2157 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2158 if (dvd_last_chapter > 0 && dvd_last_chapter <= demuxer->num_chapters) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2159 if (demuxer->chapters[dvd_last_chapter - 1].end != 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2160 mkv_d->stop_timecode =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2161 demuxer->chapters[dvd_last_chapter - 1].end;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2162 else if (dvd_last_chapter + 1 <= demuxer->num_chapters)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2163 mkv_d->stop_timecode =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2164 demuxer->chapters[dvd_last_chapter].start;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2165 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2166 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2167
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2168 if (s->end_pos == 0 || (mkv_d->indexes == NULL && index_mode < 0))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2169 demuxer->seekable = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2170 else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2171 demuxer->movi_start = s->start_pos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2172 demuxer->movi_end = s->end_pos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2173 demuxer->seekable = 1;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2174 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2175
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2176 return DEMUXER_TYPE_MATROSKA;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2177 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2178
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2179 static void demux_close_mkv(demuxer_t *demuxer)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2180 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2181 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2182
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2183 if (mkv_d) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2184 int i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2185 free_cached_dps(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2186 if (mkv_d->tracks) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2187 for (i = 0; i < mkv_d->num_tracks; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2188 demux_mkv_free_trackentry(mkv_d->tracks[i]);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2189 free(mkv_d->tracks);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2190 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2191 free(mkv_d->indexes);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2192 free(mkv_d->cluster_positions);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2193 free(mkv_d->parsed_cues);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2194 free(mkv_d->parsed_seekhead);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2195 free(mkv_d);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2196 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2197 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2198
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2199 static int demux_mkv_read_block_lacing(uint8_t *buffer, uint64_t *size,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2200 uint8_t *laces,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2201 uint32_t **all_lace_sizes)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2202 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2203 uint32_t total = 0, *lace_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2204 uint8_t flags;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2205 int i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2206
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2207 *all_lace_sizes = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2208 lace_size = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2209 /* lacing flags */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2210 flags = *buffer++;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2211 (*size)--;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2212
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2213 switch ((flags & 0x06) >> 1) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2214 case 0: /* no lacing */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2215 *laces = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2216 lace_size = calloc(*laces, sizeof(uint32_t));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2217 lace_size[0] = *size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2218 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2219
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2220 case 1: /* xiph lacing */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2221 case 2: /* fixed-size lacing */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2222 case 3: /* EBML lacing */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2223 *laces = *buffer++;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2224 (*size)--;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2225 (*laces)++;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2226 lace_size = calloc(*laces, sizeof(uint32_t));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2227
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2228 switch ((flags & 0x06) >> 1) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2229 case 1: /* xiph lacing */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2230 for (i = 0; i < *laces - 1; i++) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2231 lace_size[i] = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2232 do {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2233 lace_size[i] += *buffer;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2234 (*size)--;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2235 } while (*buffer++ == 0xFF);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2236 total += lace_size[i];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2237 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2238 lace_size[i] = *size - total;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2239 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2240
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2241 case 2: /* fixed-size lacing */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2242 for (i = 0; i < *laces; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2243 lace_size[i] = *size / *laces;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2244 break;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2245
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2246 case 3: /* EBML lacing */
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2247 {
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2248 int l;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2249 uint64_t num = ebml_read_vlen_uint(buffer, &l);
12065
cabb28717cd6 Removed the limitation to max. eight laced blocks.
mosu
parents: 12041
diff changeset
2250 if (num == EBML_UINT_INVALID) {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2251 free(lace_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2252 return 1;
12065
cabb28717cd6 Removed the limitation to max. eight laced blocks.
mosu
parents: 12041
diff changeset
2253 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2254 buffer += l;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2255 *size -= l;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2256
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2257 total = lace_size[0] = num;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2258 for (i = 1; i < *laces - 1; i++) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2259 int64_t snum;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2260 snum = ebml_read_vlen_int(buffer, &l);
12065
cabb28717cd6 Removed the limitation to max. eight laced blocks.
mosu
parents: 12041
diff changeset
2261 if (snum == EBML_INT_INVALID) {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2262 free(lace_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2263 return 1;
12065
cabb28717cd6 Removed the limitation to max. eight laced blocks.
mosu
parents: 12041
diff changeset
2264 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2265 buffer += l;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2266 *size -= l;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2267 lace_size[i] = lace_size[i - 1] + snum;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2268 total += lace_size[i];
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2269 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2270 lace_size[i] = *size - total;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2271 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2272 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2273 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2274 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2275 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2276 *all_lace_sizes = lace_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2277 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2278 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2279
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2280 static void handle_subtitles(demuxer_t *demuxer, mkv_track_t *track,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2281 char *block, int64_t size,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2282 uint64_t block_duration, uint64_t timecode)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2283 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2284 demux_packet_t *dp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2285
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2286 if (block_duration == 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2287 mp_msg(MSGT_DEMUX, MSGL_WARN,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2288 MSGTR_MPDEMUX_MKV_NoBlockDurationForSubtitleTrackFound);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2289 return;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2290 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2291
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2292 sub_utf8 = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2293 dp = new_demux_packet(size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2294 memcpy(dp->buffer, block, size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2295 dp->pts = timecode / 1000.0f;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2296 dp->endpts = (timecode + block_duration) / 1000.0f;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2297 ds_add_packet(demuxer->sub, dp);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2298 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2299
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2300 static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2301 uint8_t *buffer, uint32_t size, int block_bref)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2302 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2303 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2304 demux_packet_t *dp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2305 uint32_t timestamp = mkv_d->last_pts * 1000;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2306
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2307 dp = new_demux_packet(size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2308 memcpy(dp->buffer, buffer, size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2309
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2310 if (mkv_d->v_skip_to_keyframe) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2311 dp->pts = mkv_d->last_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2312 track->rv_kf_base = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2313 track->rv_kf_pts = timestamp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2314 } else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2315 dp->pts =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2316 real_fix_timestamp(dp->buffer, timestamp,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2317 ((sh_video_t *) demuxer->video->sh)->bih->
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2318 biCompression, &track->rv_kf_base,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2319 &track->rv_kf_pts, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2320 dp->pos = demuxer->filepos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2321 dp->flags = block_bref ? 0 : 0x10;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2322
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2323 ds_add_packet(demuxer->video, dp);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2324 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2325
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2326 static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2327 uint8_t *buffer, uint32_t size, int block_bref)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2328 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2329 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2330 int sps = track->sub_packet_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2331 int sph = track->sub_packet_h;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2332 int cfs = track->coded_framesize;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2333 int w = track->audiopk_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2334 int spc = track->sub_packet_cnt;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2335 demux_packet_t *dp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2336 int x;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2337
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2338 if ((track->a_formattag == mmioFOURCC('2', '8', '_', '8'))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2339 || (track->a_formattag == mmioFOURCC('c', 'o', 'o', 'k'))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2340 || (track->a_formattag == mmioFOURCC('a', 't', 'r', 'c'))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2341 || (track->a_formattag == mmioFOURCC('s', 'i', 'p', 'r'))) {
18036
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
2342 // if(!block_bref)
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
2343 // spc = track->sub_packet_cnt = 0;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2344 switch (track->a_formattag) {
18036
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
2345 case mmioFOURCC('2', '8', '_', '8'):
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2346 for (x = 0; x < sph / 2; x++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2347 memcpy(track->audio_buf + x * 2 * w + spc * cfs,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2348 buffer + cfs * x, cfs);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2349 break;
18036
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
2350 case mmioFOURCC('c', 'o', 'o', 'k'):
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
2351 case mmioFOURCC('a', 't', 'r', 'c'):
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2352 for (x = 0; x < w / sps; x++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2353 memcpy(track->audio_buf +
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2354 sps * (sph * x + ((sph + 1) / 2) * (spc & 1) +
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2355 (spc >> 1)), buffer + sps * x, sps);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2356 break;
18036
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
2357 case mmioFOURCC('s', 'i', 'p', 'r'):
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2358 memcpy(track->audio_buf + spc * w, buffer, w);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2359 if (spc == sph - 1) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2360 int n;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2361 int bs = sph * w * 2 / 96; // nibbles per subpacket
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2362 // Perform reordering
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2363 for (n = 0; n < 38; n++) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2364 int j;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2365 int i = bs * sipr_swaps[n][0];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2366 int o = bs * sipr_swaps[n][1];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2367 // swap nibbles of block 'i' with 'o' TODO: optimize
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2368 for (j = 0; j < bs; j++) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2369 int x = (i & 1) ?
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2370 (track->audio_buf[i >> 1] >> 4) :
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2371 (track->audio_buf[i >> 1] & 0x0F);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2372 int y = (o & 1) ?
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2373 (track->audio_buf[o >> 1] >> 4) :
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2374 (track->audio_buf[o >> 1] & 0x0F);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2375 if (o & 1)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2376 track->audio_buf[o >> 1] =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2377 (track->audio_buf[o >> 1] & 0x0F) | (x << 4);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2378 else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2379 track->audio_buf[o >> 1] =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2380 (track->audio_buf[o >> 1] & 0xF0) | x;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2381 if (i & 1)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2382 track->audio_buf[i >> 1] =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2383 (track->audio_buf[i >> 1] & 0x0F) | (y << 4);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2384 else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2385 track->audio_buf[i >> 1] =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2386 (track->audio_buf[i >> 1] & 0xF0) | y;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2387 ++i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2388 ++o;
18036
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
2389 }
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
2390 }
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
2391 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2392 break;
18036
3406a28698cf Fix RealAudio codecs (add descrambling)
rtognimp
parents: 17923
diff changeset
2393 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2394 track->audio_timestamp[track->sub_packet_cnt] =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2395 (track->ra_pts == mkv_d->last_pts) ? 0 : (mkv_d->last_pts);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2396 track->ra_pts = mkv_d->last_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2397 if (track->sub_packet_cnt == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2398 track->audio_filepos = demuxer->filepos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2399 if (++(track->sub_packet_cnt) == sph) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2400 int apk_usize =
32112
741bcef4ad3a Remove a useless cast.
reimar
parents: 32111
diff changeset
2401 ((sh_audio_t *) demuxer->audio->sh)->wf->nBlockAlign;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2402 track->sub_packet_cnt = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2403 // Release all the audio packets
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2404 for (x = 0; x < sph * w / apk_usize; x++) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2405 dp = new_demux_packet(apk_usize);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2406 memcpy(dp->buffer, track->audio_buf + x * apk_usize,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2407 apk_usize);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2408 /* Put timestamp only on packets that correspond to original
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2409 * audio packets in file */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2410 dp->pts = (x * apk_usize % w) ? 0 :
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2411 track->audio_timestamp[x * apk_usize / w];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2412 dp->pos = track->audio_filepos; // all equal
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2413 dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2414 ds_add_packet(demuxer->audio, dp);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2415 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2416 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2417 } else { // Not a codec that require reordering
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2418 dp = new_demux_packet(size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2419 memcpy(dp->buffer, buffer, size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2420 if (track->ra_pts == mkv_d->last_pts && !mkv_d->a_skip_to_keyframe)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2421 dp->pts = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2422 else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2423 dp->pts = mkv_d->last_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2424 track->ra_pts = mkv_d->last_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2425
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2426 dp->pos = demuxer->filepos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2427 dp->flags = block_bref ? 0 : 0x10;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2428 ds_add_packet(demuxer->audio, dp);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2429 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2430 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2431
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2432 /** Reorder timecodes and add cached demux packets to the queues.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2433 *
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2434 * Timecode reordering is needed if a video track contains B frames that
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2435 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2436 * MPlayer doesn't like timestamps in display order. This function adjusts
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2437 * the timestamp of cached frames (which are exactly one I/P frame followed
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2438 * by one or more B frames) so that they are in coding order again.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2439 *
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2440 * Example: The track with 25 FPS contains four frames with the timecodes
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2441 * I at 0ms, P at 120ms, B at 40ms and B at 80ms. As soon as the next I
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2442 * or P frame arrives these timecodes can be changed to I at 0ms, P at 40ms,
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2443 * B at 80ms and B at 120ms.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2444 *
16912
4dea8b8f3b65 sort timestamps instead of assuming conventional B-frame order. (fixes x264 B-pyramid)
lorenm
parents: 16877
diff changeset
2445 * This works for simple H.264 B-frame pyramids, but not for arbitrary orders.
4dea8b8f3b65 sort timestamps instead of assuming conventional B-frame order. (fixes x264 B-pyramid)
lorenm
parents: 16877
diff changeset
2446 *
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2447 * \param demuxer The Matroska demuxer struct for this instance.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2448 * \param track The track structure whose cache should be handled.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2449 */
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2450 static void flush_cached_dps(demuxer_t *demuxer, mkv_track_t *track)
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2451 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2452 int i, ok;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2453
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2454 if (track->num_cached_dps == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2455 return;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2456
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2457 do {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2458 ok = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2459 for (i = 1; i < track->num_cached_dps; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2460 if (track->cached_dps[i - 1]->pts > track->cached_dps[i]->pts) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2461 float tmp_pts = track->cached_dps[i - 1]->pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2462 track->cached_dps[i - 1]->pts = track->cached_dps[i]->pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2463 track->cached_dps[i]->pts = tmp_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2464 ok = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2465 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2466 } while (!ok);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2467
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2468 for (i = 0; i < track->num_cached_dps; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2469 ds_add_packet(demuxer->video, track->cached_dps[i]);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2470 track->num_cached_dps = 0;
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2471 }
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2472
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2473 /** Cache video frames if timecodes have to be reordered.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2474 *
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2475 * Timecode reordering is needed if a video track contains B frames that
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2476 * are timestamped in display order (e.g. MPEG-1, MPEG-2 or "native" MPEG-4).
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2477 * This function takes in a Matroska block read from the file, allocates a
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2478 * demux packet for it, fills in its values, allocates space for storing
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2479 * pointers to the cached demux packets and adds the packet to it. If
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2480 * the packet contains an I or a P frame then ::flush_cached_dps is called
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2481 * in order to send the old cached frames downstream.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2482 *
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2483 * \param demuxer The Matroska demuxer struct for this instance.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2484 * \param track The packet is meant for this track.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2485 * \param buffer The actual frame contents.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2486 * \param size The frame size in bytes.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2487 * \param block_bref A relative timecode (backward reference). If it is \c 0
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2488 * then the frame is an I frame.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2489 * \param block_fref A relative timecode (forward reference). If it is \c 0
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2490 * then the frame is either an I frame or a P frame depending on the value
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2491 * of \a block_bref. Otherwise it's a B frame.
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2492 */
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2493 static void handle_video_bframes(demuxer_t *demuxer, mkv_track_t *track,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2494 uint8_t *buffer, uint32_t size,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2495 int block_bref, int block_fref)
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2496 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2497 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2498 demux_packet_t *dp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2499
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2500 dp = new_demux_packet(size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2501 memcpy(dp->buffer, buffer, size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2502 dp->pos = demuxer->filepos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2503 dp->pts = mkv_d->last_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2504 if ((track->num_cached_dps > 0) && (dp->pts < track->max_pts))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2505 block_fref = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2506 if (block_fref == 0) /* I or P frame */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2507 flush_cached_dps(demuxer, track);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2508 if (block_bref != 0) /* I frame, don't cache it */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2509 dp->flags = 0x10;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2510 if ((track->num_cached_dps + 1) > track->num_allocated_dps) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2511 track->cached_dps = (demux_packet_t **)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2512 realloc(track->cached_dps,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2513 (track->num_cached_dps + 10) * sizeof(demux_packet_t *));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2514 track->num_allocated_dps += 10;
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2515 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2516 track->cached_dps[track->num_cached_dps] = dp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2517 track->num_cached_dps++;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2518 if (dp->pts > track->max_pts)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2519 track->max_pts = dp->pts;
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2520 }
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2521
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2522 static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2523 uint64_t block_duration, int64_t block_bref,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2524 int64_t block_fref, uint8_t simpleblock)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2525 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2526 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2527 mkv_track_t *track = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2528 demux_stream_t *ds = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2529 uint64_t old_length;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2530 int64_t tc;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2531 uint32_t *lace_size;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2532 uint8_t laces, flags;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2533 int i, num, tmp, use_this_block = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2534 float current_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2535 int16_t time;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2536
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2537 /* first byte(s): track num */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2538 num = ebml_read_vlen_uint(block, &tmp);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2539 block += tmp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2540 /* time (relative to cluster time) */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2541 time = block[0] << 8 | block[1];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2542 block += 2;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2543 length -= tmp + 2;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2544 old_length = length;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2545 flags = block[0];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2546 if (demux_mkv_read_block_lacing(block, &length, &laces, &lace_size))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2547 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2548 block += old_length - length;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2549
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2550 tc = ((time * mkv_d->tc_scale + mkv_d->cluster_tc) / 1000000.0 -
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2551 mkv_d->first_tc);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2552 if (tc < 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2553 tc = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2554 if (mkv_d->stop_timecode > 0 && tc > mkv_d->stop_timecode) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2555 free(lace_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2556 return -1;
12721
44895a7161c8 Do not dereference NULL if no track could be found for a block.
mosu
parents: 12550
diff changeset
2557 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2558 current_pts = tc / 1000.0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2559
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2560 for (i = 0; i < mkv_d->num_tracks; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2561 if (mkv_d->tracks[i]->tnum == num) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2562 track = mkv_d->tracks[i];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2563 break;
19977
8ada6970000a Add matroska v2 (SimpleBlock) support.
eugeni
parents: 19812
diff changeset
2564 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2565 if (track == NULL) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2566 free(lace_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2567 return 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2568 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2569 if (num == demuxer->audio->id) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2570 ds = demuxer->audio;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2571
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2572 if (mkv_d->a_skip_to_keyframe) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2573 if (simpleblock) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2574 if (!(flags & 0x80)) /*current frame isn't a keyframe */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2575 use_this_block = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2576 } else if (block_bref != 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2577 use_this_block = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2578 } else if (mkv_d->v_skip_to_keyframe)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2579 use_this_block = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2580
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2581 if (track->fix_i_bps && use_this_block) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2582 sh_audio_t *sh = (sh_audio_t *) ds->sh;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2583
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2584 if (block_duration != 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2585 sh->i_bps = length * 1000 / block_duration;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2586 track->fix_i_bps = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2587 } else if (track->qt_last_a_pts == 0.0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2588 track->qt_last_a_pts = current_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2589 else if (track->qt_last_a_pts != current_pts) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2590 sh->i_bps = length / (current_pts - track->qt_last_a_pts);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2591 track->fix_i_bps = 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2592 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2593 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2594 } else if (tc < mkv_d->skip_to_timecode)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2595 use_this_block = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2596 else if (num == demuxer->video->id) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2597 ds = demuxer->video;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2598 if (mkv_d->v_skip_to_keyframe) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2599 if (simpleblock) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2600 if (!(flags & 0x80)) /*current frame isn't a keyframe */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2601 use_this_block = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2602 } else if (block_bref != 0 || block_fref != 0)
19977
8ada6970000a Add matroska v2 (SimpleBlock) support.
eugeni
parents: 19812
diff changeset
2603 use_this_block = 0;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2604 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2605 } else if (num == demuxer->sub->id) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2606 ds = demuxer->sub;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2607 if (track->subtitle_type != MATROSKA_SUBTYPE_VOBSUB) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2608 if (!mkv_d->v_skip_to_keyframe)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2609 handle_subtitles(demuxer, track, block, length, block_duration,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2610 tc);
19977
8ada6970000a Add matroska v2 (SimpleBlock) support.
eugeni
parents: 19812
diff changeset
2611 use_this_block = 0;
8ada6970000a Add matroska v2 (SimpleBlock) support.
eugeni
parents: 19812
diff changeset
2612 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2613 } else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2614 use_this_block = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2615
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2616 if (use_this_block) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2617 mkv_d->last_pts = current_pts;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2618 mkv_d->last_filepos = demuxer->filepos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2619
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2620 for (i = 0; i < laces; i++) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2621 if (ds == demuxer->video && track->realmedia)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2622 handle_realvideo(demuxer, track, block, lace_size[i],
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2623 block_bref);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2624 else if (ds == demuxer->audio && track->realmedia)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2625 handle_realaudio(demuxer, track, block, lace_size[i],
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2626 block_bref);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2627 else if (ds == demuxer->video && track->reorder_timecodes)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2628 handle_video_bframes(demuxer, track, block, lace_size[i],
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2629 block_bref, block_fref);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2630 else {
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
2631 int modified;
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
2632 size_t size = lace_size[i];
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2633 demux_packet_t *dp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2634 uint8_t *buffer;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2635 modified = demux_mkv_decode(track, block, &buffer, &size, 1);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2636 if (buffer) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2637 dp = new_demux_packet(size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2638 memcpy(dp->buffer, buffer, size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2639 if (modified)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2640 free(buffer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2641 dp->flags = (block_bref == 0
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2642 && block_fref == 0) ? 0x10 : 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2643 /* If default_duration is 0, assume no pts value is known
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2644 * for packets after the first one (rather than all pts
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2645 * values being the same) */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2646 if (i == 0 || track->default_duration)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2647 dp->pts =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2648 mkv_d->last_pts + i * track->default_duration;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2649 ds_add_packet(ds, dp);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2650 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2651 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2652 block += lace_size[i];
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2653 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2654
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2655 if (ds == demuxer->video) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2656 mkv_d->v_skip_to_keyframe = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2657 mkv_d->skip_to_timecode = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2658 } else if (ds == demuxer->audio)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2659 mkv_d->a_skip_to_keyframe = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2660
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2661 free(lace_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2662 return 1;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2663 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2664
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2665 free(lace_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2666 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2667 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2668
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2669 static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2670 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2671 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2672 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2673 uint64_t l;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2674 int il, tmp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2675
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2676 while (1) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2677 while (mkv_d->cluster_size > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2678 uint64_t block_duration = 0, block_length = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2679 int64_t block_bref = 0, block_fref = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2680 uint8_t *block = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2681
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2682 while (mkv_d->blockgroup_size > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2683 switch (ebml_read_id(s, &il)) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2684 case MATROSKA_ID_BLOCKDURATION:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2685 block_duration = ebml_read_uint(s, &l);
23704
ce80673fbf0d Add some missing frees.
reimar
parents: 23703
diff changeset
2686 if (block_duration == EBML_UINT_INVALID) {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2687 free(block);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2688 return 0;
23704
ce80673fbf0d Add some missing frees.
reimar
parents: 23703
diff changeset
2689 }
19810
7dfc3d2bb54b Fix block duration calculation in mkv demuxer.
eugeni
parents: 19809
diff changeset
2690 block_duration *= mkv_d->tc_scale / 1000000.0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2691 break;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2692
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2693 case MATROSKA_ID_BLOCK:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2694 block_length = ebml_read_length(s, &tmp);
20155
c903e0d80f02 More possible memleaks.
reimar
parents: 20154
diff changeset
2695 free(block);
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2696 if (block_length > SIZE_MAX - AV_LZO_INPUT_PADDING)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2697 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2698 block = malloc(block_length + AV_LZO_INPUT_PADDING);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2699 demuxer->filepos = stream_tell(s);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2700 if (stream_read(s, block, block_length) !=
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2701 (int) block_length) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2702 free(block);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2703 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2704 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2705 l = tmp + block_length;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2706 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2707
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2708 case MATROSKA_ID_REFERENCEBLOCK:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2709 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2710 int64_t num = ebml_read_int(s, &l);
23704
ce80673fbf0d Add some missing frees.
reimar
parents: 23703
diff changeset
2711 if (num == EBML_INT_INVALID) {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2712 free(block);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2713 return 0;
23704
ce80673fbf0d Add some missing frees.
reimar
parents: 23703
diff changeset
2714 }
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2715 if (num <= 0)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2716 block_bref = num;
14054
53ea955d19fa Added support for MPEG-1 and MPEG-2 in Matroska.
mosu
parents: 14046
diff changeset
2717 else
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2718 block_fref = num;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2719 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2720 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2721
11934
bef061911390 Exit when an invalid EBML ID has been read (e.g. for files that have been cut off).
mosu
parents: 11901
diff changeset
2722 case EBML_ID_INVALID:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2723 free(block);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2724 return 0;
11934
bef061911390 Exit when an invalid EBML ID has been read (e.g. for files that have been cut off).
mosu
parents: 11901
diff changeset
2725
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2726 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2727 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2728 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2729 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2730 mkv_d->blockgroup_size -= l + il;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2731 mkv_d->cluster_size -= l + il;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2732 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2733
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2734 if (block) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2735 int res = handle_block(demuxer, block, block_length,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2736 block_duration, block_bref, block_fref,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2737 0);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2738 free(block);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2739 if (res < 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2740 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2741 if (res)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2742 return 1;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2743 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2744
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2745 if (mkv_d->cluster_size > 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2746 switch (ebml_read_id(s, &il)) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2747 case MATROSKA_ID_CLUSTERTIMECODE:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2748 {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2749 uint64_t num = ebml_read_uint(s, &l);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2750 if (num == EBML_UINT_INVALID)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2751 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2752 if (!mkv_d->has_first_tc) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2753 mkv_d->first_tc = num * mkv_d->tc_scale / 1000000.0;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2754 mkv_d->has_first_tc = 1;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2755 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2756 mkv_d->cluster_tc = num * mkv_d->tc_scale;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2757 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2758 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2759
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2760 case MATROSKA_ID_BLOCKGROUP:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2761 mkv_d->blockgroup_size = ebml_read_length(s, &tmp);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2762 l = tmp;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2763 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2764
19977
8ada6970000a Add matroska v2 (SimpleBlock) support.
eugeni
parents: 19812
diff changeset
2765 case MATROSKA_ID_SIMPLEBLOCK:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2766 {
19977
8ada6970000a Add matroska v2 (SimpleBlock) support.
eugeni
parents: 19812
diff changeset
2767 int res;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2768 block_length = ebml_read_length(s, &tmp);
32220
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
2769 if (block_length > SIZE_MAX)
2494181f252b Add many integer overflow checks to mkv demuxer.
reimar
parents: 32209
diff changeset
2770 return 0;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2771 block = malloc(block_length);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2772 demuxer->filepos = stream_tell(s);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2773 if (stream_read(s, block, block_length) !=
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2774 (int) block_length) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2775 free(block);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2776 return 0;
20155
c903e0d80f02 More possible memleaks.
reimar
parents: 20154
diff changeset
2777 }
19977
8ada6970000a Add matroska v2 (SimpleBlock) support.
eugeni
parents: 19812
diff changeset
2778 l = tmp + block_length;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2779 res = handle_block(demuxer, block, block_length,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2780 block_duration, block_bref,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2781 block_fref, 1);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2782 free(block);
19977
8ada6970000a Add matroska v2 (SimpleBlock) support.
eugeni
parents: 19812
diff changeset
2783 mkv_d->cluster_size -= l + il;
8ada6970000a Add matroska v2 (SimpleBlock) support.
eugeni
parents: 19812
diff changeset
2784 if (res < 0)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2785 return 0;
19977
8ada6970000a Add matroska v2 (SimpleBlock) support.
eugeni
parents: 19812
diff changeset
2786 else if (res)
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2787 return 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2788 else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2789 mkv_d->cluster_size += l + il;
19977
8ada6970000a Add matroska v2 (SimpleBlock) support.
eugeni
parents: 19812
diff changeset
2790 break;
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2791 }
11934
bef061911390 Exit when an invalid EBML ID has been read (e.g. for files that have been cut off).
mosu
parents: 11901
diff changeset
2792 case EBML_ID_INVALID:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2793 return 0;
11934
bef061911390 Exit when an invalid EBML ID has been read (e.g. for files that have been cut off).
mosu
parents: 11901
diff changeset
2794
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2795 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2796 ebml_read_skip(s, &l);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2797 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2798 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2799 mkv_d->cluster_size -= l + il;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2800 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2801 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2802
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2803 if (ebml_read_id(s, &il) != MATROSKA_ID_CLUSTER)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2804 return 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2805 add_cluster_position(mkv_d, stream_tell(s) - il);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2806 mkv_d->cluster_size = ebml_read_length(s, NULL);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2807 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2808
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2809 return 0;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2810 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2811
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2812 static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2813 float audio_delay, int flags)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2814 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2815 free_cached_dps(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2816 if (!(flags & SEEK_FACTOR)) { /* time in secs */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2817 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2818 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2819 int64_t target_timecode = 0, diff, min_diff = 0xFFFFFFFFFFFFFFFLL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2820 int i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2821
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2822 if (!(flags & SEEK_ABSOLUTE)) /* relative seek */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2823 target_timecode = (int64_t) (mkv_d->last_pts * 1000.0);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2824 target_timecode += (int64_t) (rel_seek_secs * 1000.0);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2825 if (target_timecode < 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2826 target_timecode = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2827
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2828 if (mkv_d->indexes == NULL) { /* no index was found */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2829 uint64_t target_filepos, cluster_pos, max_pos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2830
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2831 target_filepos =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2832 (uint64_t) (target_timecode * mkv_d->last_filepos /
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2833 (mkv_d->last_pts * 1000.0));
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2834
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2835 max_pos = mkv_d->num_cluster_pos ?
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2836 mkv_d->cluster_positions[mkv_d->num_cluster_pos - 1] : 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2837 if (target_filepos > max_pos) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2838 if ((off_t) max_pos > stream_tell(s))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2839 stream_seek(s, max_pos);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2840 else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2841 stream_seek(s, stream_tell(s) + mkv_d->cluster_size);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2842 /* parse all the clusters upto target_filepos */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2843 while (!s->eof && stream_tell(s) < (off_t) target_filepos) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2844 switch (ebml_read_id(s, &i)) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2845 case MATROSKA_ID_CLUSTER:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2846 add_cluster_position(mkv_d,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2847 (uint64_t) stream_tell(s) - i);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2848 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2849
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2850 case MATROSKA_ID_CUES:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2851 demux_mkv_read_cues(demuxer);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2852 break;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2853 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2854 ebml_read_skip(s, NULL);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2855 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2856 if (s->eof)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2857 stream_reset(s);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2858 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2859
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2860 if (mkv_d->indexes == NULL) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2861 cluster_pos = mkv_d->cluster_positions[0];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2862 /* Let's find the nearest cluster */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2863 for (i = 0; i < mkv_d->num_cluster_pos; i++) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2864 diff = mkv_d->cluster_positions[i] - target_filepos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2865 if (rel_seek_secs < 0 && diff < 0 && -diff < min_diff) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2866 cluster_pos = mkv_d->cluster_positions[i];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2867 min_diff = -diff;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2868 } else if (rel_seek_secs > 0
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2869 && (diff < 0 ? -1 * diff : diff) < min_diff) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2870 cluster_pos = mkv_d->cluster_positions[i];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2871 min_diff = diff < 0 ? -1 * diff : diff;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2872 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2873 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2874 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2875 stream_seek(s, cluster_pos);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2876 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2877 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2878 mkv_index_t *index = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2879 int seek_id = (demuxer->video->id < 0) ?
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2880 demuxer->audio->id : demuxer->video->id;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2881
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2882 /* let's find the entry in the indexes with the smallest */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2883 /* difference to the wanted timecode. */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2884 for (i = 0; i < mkv_d->num_indexes; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2885 if (mkv_d->indexes[i].tnum == seek_id) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2886 diff =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2887 target_timecode + mkv_d->first_tc -
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2888 (int64_t) mkv_d->indexes[i].timecode *
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2889 mkv_d->tc_scale / 1000000.0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2890
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2891 if ((flags & SEEK_ABSOLUTE
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2892 || target_timecode <= mkv_d->last_pts * 1000)) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2893 // Absolute seek or seek backward: find the last index
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2894 // position before target time
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2895 if (diff < 0 || diff >= min_diff)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2896 continue;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2897 } else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2898 // Relative seek forward: find the first index position
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2899 // after target time. If no such index exists, find last
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2900 // position between current position and target time.
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2901 if (diff <= 0) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2902 if (min_diff <= 0 && diff <= min_diff)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2903 continue;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2904 } else if (diff >=
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2905 FFMIN(target_timecode - mkv_d->last_pts,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2906 min_diff))
22616
09dc129234a0 Matroska seeking fixes
uau
parents: 22606
diff changeset
2907 continue;
09dc129234a0 Matroska seeking fixes
uau
parents: 22606
diff changeset
2908 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2909 min_diff = diff;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2910 index = mkv_d->indexes + i;
22616
09dc129234a0 Matroska seeking fixes
uau
parents: 22606
diff changeset
2911 }
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2912
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2913 if (index) { /* We've found an entry. */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2914 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2915 stream_seek(s, index->filepos);
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2916 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2917 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2918
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2919 if (demuxer->video->id >= 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2920 mkv_d->v_skip_to_keyframe = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2921 if (rel_seek_secs > 0.0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2922 mkv_d->skip_to_timecode = target_timecode;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2923 mkv_d->a_skip_to_keyframe = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2924
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2925 demux_mkv_fill_buffer(demuxer, NULL);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2926 } else if ((demuxer->movi_end <= 0) || !(flags & SEEK_ABSOLUTE))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2927 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2928 else {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2929 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2930 stream_t *s = demuxer->stream;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2931 uint64_t target_filepos;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2932 mkv_index_t *index = NULL;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2933 int i;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2934
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2935 if (mkv_d->indexes == NULL) { /* no index was found *//* I'm lazy... */
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2936 mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n");
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2937 return;
12073
0ef56fc11e4e Implemented "seek to position".
mosu
parents: 12065
diff changeset
2938 }
0ef56fc11e4e Implemented "seek to position".
mosu
parents: 12065
diff changeset
2939
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2940 target_filepos = (uint64_t) (demuxer->movi_end * rel_seek_secs);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2941 for (i = 0; i < mkv_d->num_indexes; i++)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2942 if (mkv_d->indexes[i].tnum == demuxer->video->id)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2943 if ((index == NULL)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2944 || ((mkv_d->indexes[i].filepos >= target_filepos)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2945 && ((index->filepos < target_filepos)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2946 || (mkv_d->indexes[i].filepos < index->filepos))))
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2947 index = &mkv_d->indexes[i];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2948
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2949 if (!index)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2950 return;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2951
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2952 mkv_d->cluster_size = mkv_d->blockgroup_size = 0;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2953 stream_seek(s, index->filepos);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2954
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2955 if (demuxer->video->id >= 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2956 mkv_d->v_skip_to_keyframe = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2957 mkv_d->skip_to_timecode = index->timecode;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2958 mkv_d->a_skip_to_keyframe = 1;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2959
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2960 demux_mkv_fill_buffer(demuxer, NULL);
12073
0ef56fc11e4e Implemented "seek to position".
mosu
parents: 12065
diff changeset
2961 }
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2962 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2963
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2964 static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg)
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2965 {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2966 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2967
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2968 switch (cmd) {
25919
382672c7480a Allow demuxers to choose a default value for correct_pts
reimar
parents: 25883
diff changeset
2969 case DEMUXER_CTRL_CORRECT_PTS:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2970 return DEMUXER_CTRL_OK;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2971 case DEMUXER_CTRL_GET_TIME_LENGTH:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2972 if (mkv_d->duration == 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2973 return DEMUXER_CTRL_DONTKNOW;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2974
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2975 *((double *) arg) = (double) mkv_d->duration;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2976 return DEMUXER_CTRL_OK;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2977
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2978 case DEMUXER_CTRL_GET_PERCENT_POS:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2979 if (mkv_d->duration == 0) {
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2980 return DEMUXER_CTRL_DONTKNOW;
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2981 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2982
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2983 *((int *) arg) = (int) (100 * mkv_d->last_pts / mkv_d->duration);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2984 return DEMUXER_CTRL_OK;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
2985
15154
898f68adad2b Online audio switching now supports Matroska too. Patch by Michael Behrisch
gpoirier
parents: 14843
diff changeset
2986 case DEMUXER_CTRL_SWITCH_AUDIO:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2987 if (demuxer->audio && demuxer->audio->sh) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2988 sh_audio_t *sh = demuxer->a_streams[demuxer->audio->id];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2989 int aid = *(int *) arg;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2990 if (aid < 0)
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2991 aid = (sh->aid + 1) % mkv_d->last_aid;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2992 if (aid != sh->aid) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2993 mkv_track_t *track =
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2994 demux_mkv_find_track_by_num(mkv_d, aid,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2995 MATROSKA_TRACK_AUDIO);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2996 if (track) {
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2997 demuxer->audio->id = track->tnum;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2998 sh = demuxer->a_streams[demuxer->audio->id];
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
2999 ds_free_packs(demuxer->audio);
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3000 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3001 }
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3002 *(int *) arg = sh->aid;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3003 } else
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3004 *(int *) arg = -2;
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3005 return DEMUXER_CTRL_OK;
15154
898f68adad2b Online audio switching now supports Matroska too. Patch by Michael Behrisch
gpoirier
parents: 14843
diff changeset
3006
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
3007 default:
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3008 return DEMUXER_CTRL_NOTIMPL;
11807
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
3009 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
3010 }
9a81d7b4c0b6 Added the new C based Matroska demuxer by Aurelien Jacobs.
mosu
parents:
diff changeset
3011
25707
d4fe6e23283e Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents: 25658
diff changeset
3012 const demuxer_desc_t demuxer_desc_matroska = {
31177
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3013 "Matroska demuxer",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3014 "mkv",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3015 "Matroska",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3016 "Aurelien Jacobs",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3017 "",
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3018 DEMUXER_TYPE_MATROSKA,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3019 1, // safe autodetect
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3020 demux_mkv_open,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3021 demux_mkv_fill_buffer,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3022 NULL,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3023 demux_close_mkv,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3024 demux_mkv_seek,
9175a9a22051 cosmetics: Reformat in K&R coding style.
diego
parents: 31176
diff changeset
3025 demux_mkv_control
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15701
diff changeset
3026 };