Mercurial > libavformat.hg
comparison matroskadec.c @ 3315:22ba37584545 libavformat
demux chapters out of matroska
patch by Anton Khirnov wyskas _at_ gmail _dot_ com
author | aurel |
---|---|
date | Thu, 22 May 2008 22:07:09 +0000 |
parents | edabe3db2b6e |
children | 842a6746532e |
comparison
equal
deleted
inserted
replaced
3314:724f338005d4 | 3315:22ba37584545 |
---|---|
2137 } | 2137 } |
2138 | 2138 |
2139 return res; | 2139 return res; |
2140 } | 2140 } |
2141 | 2141 |
2142 static int | |
2143 matroska_parse_chapters(AVFormatContext *s) | |
2144 { | |
2145 MatroskaDemuxContext *matroska = s->priv_data; | |
2146 int res = 0; | |
2147 uint32_t id; | |
2148 | |
2149 av_log(s, AV_LOG_DEBUG, "parsing chapters...\n"); | |
2150 | |
2151 while (res == 0) { | |
2152 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
2153 res = AVERROR(EIO); | |
2154 break; | |
2155 } else if (matroska->level_up) { | |
2156 matroska->level_up--; | |
2157 break; | |
2158 } | |
2159 | |
2160 switch (id) { | |
2161 case MATROSKA_ID_EDITIONENTRY: { | |
2162 uint64_t end = AV_NOPTS_VALUE, start = AV_NOPTS_VALUE; | |
2163 char* title = NULL; | |
2164 /* if there is more than one chapter edition | |
2165 we take only the first one */ | |
2166 if(s->chapters) { | |
2167 ebml_read_skip(matroska); | |
2168 break; | |
2169 } | |
2170 | |
2171 if ((res = ebml_read_master(matroska, &id)) < 0) | |
2172 break; | |
2173 | |
2174 while (res == 0) { | |
2175 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
2176 res = AVERROR(EIO); | |
2177 break; | |
2178 } else if (matroska->level_up) { | |
2179 matroska->level_up--; | |
2180 break; | |
2181 } | |
2182 | |
2183 switch (id) { | |
2184 case MATROSKA_ID_CHAPTERATOM: | |
2185 if ((res = ebml_read_master(matroska, &id)) < 0) | |
2186 break; | |
2187 | |
2188 while (res == 0) { | |
2189 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
2190 res = AVERROR(EIO); | |
2191 break; | |
2192 } else if (matroska->level_up) { | |
2193 matroska->level_up--; | |
2194 break; | |
2195 } | |
2196 | |
2197 switch (id) { | |
2198 case MATROSKA_ID_CHAPTERTIMEEND: | |
2199 res = ebml_read_uint(matroska, &id, &end); | |
2200 break; | |
2201 | |
2202 case MATROSKA_ID_CHAPTERTIMESTART: | |
2203 res = ebml_read_uint(matroska, &id, &start); | |
2204 break; | |
2205 | |
2206 case MATROSKA_ID_CHAPTERDISPLAY: | |
2207 if ((res = ebml_read_master(matroska, &id)) < 0) | |
2208 break; | |
2209 | |
2210 while (res == 0) { | |
2211 if (!(id = ebml_peek_id(matroska, &matroska->level_up))) { | |
2212 res = AVERROR(EIO); | |
2213 break; | |
2214 } else if (matroska->level_up) { | |
2215 matroska->level_up--; | |
2216 break; | |
2217 } | |
2218 | |
2219 switch (id) { | |
2220 case MATROSKA_ID_CHAPSTRING: | |
2221 res = ebml_read_utf8(matroska, &id, &title); | |
2222 break; | |
2223 | |
2224 default: | |
2225 av_log(s, AV_LOG_INFO, "Ignoring unknown Chapter display ID 0x%x\n", id); | |
2226 case EBML_ID_VOID: | |
2227 res = ebml_read_skip(matroska); | |
2228 break; | |
2229 } | |
2230 | |
2231 if (matroska->level_up) { | |
2232 matroska->level_up--; | |
2233 break; | |
2234 } | |
2235 } | |
2236 break; | |
2237 | |
2238 default: | |
2239 av_log(s, AV_LOG_INFO, "Ignoring unknown Chapter atom ID 0x%x\n", id); | |
2240 case MATROSKA_ID_CHAPTERUID: | |
2241 case MATROSKA_ID_CHAPTERFLAGHIDDEN: | |
2242 case EBML_ID_VOID: | |
2243 res = ebml_read_skip(matroska); | |
2244 break; | |
2245 } | |
2246 | |
2247 if (matroska->level_up) { | |
2248 matroska->level_up--; | |
2249 break; | |
2250 } | |
2251 } | |
2252 | |
2253 if(start != AV_NOPTS_VALUE && end != AV_NOPTS_VALUE) | |
2254 res = ff_new_chapter(s, start * AV_TIME_BASE / 1000000000 , end * AV_TIME_BASE / 1000000000, title ? title : "(unnamed)"); | |
2255 av_free(title); | |
2256 break; | |
2257 | |
2258 default: | |
2259 av_log(s, AV_LOG_INFO, "Ignoring unknown Edition entry ID 0x%x\n", id); | |
2260 case MATROSKA_ID_EDITIONUID: | |
2261 case MATROSKA_ID_EDITIONFLAGHIDDEN: | |
2262 case EBML_ID_VOID: | |
2263 res = ebml_read_skip(matroska); | |
2264 break; | |
2265 } | |
2266 | |
2267 | |
2268 if (matroska->level_up) { | |
2269 matroska->level_up--; | |
2270 break; | |
2271 } | |
2272 } | |
2273 break; | |
2274 } | |
2275 | |
2276 default: | |
2277 av_log(s, AV_LOG_INFO, "Expected an Edition entry (0x%x), but found 0x%x\n", MATROSKA_ID_EDITIONENTRY, id); | |
2278 case EBML_ID_VOID: | |
2279 res = ebml_read_skip(matroska); | |
2280 break; | |
2281 } | |
2282 | |
2283 if (matroska->level_up) { | |
2284 matroska->level_up--; | |
2285 break; | |
2286 } | |
2287 } | |
2288 | |
2289 return res; | |
2290 } | |
2291 | |
2142 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x)) | 2292 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*x)) |
2143 | 2293 |
2144 static int | 2294 static int |
2145 matroska_aac_profile (char *codec_id) | 2295 matroska_aac_profile (char *codec_id) |
2146 { | 2296 { |
2286 | 2436 |
2287 case MATROSKA_ID_CLUSTER: { | 2437 case MATROSKA_ID_CLUSTER: { |
2288 /* Do not read the master - this will be done in the next | 2438 /* Do not read the master - this will be done in the next |
2289 * call to matroska_read_packet. */ | 2439 * call to matroska_read_packet. */ |
2290 res = 1; | 2440 res = 1; |
2441 break; | |
2442 } | |
2443 | |
2444 case MATROSKA_ID_CHAPTERS: { | |
2445 if ((res = ebml_read_master(matroska, &id)) < 0) | |
2446 return res; | |
2447 res = matroska_parse_chapters(s); | |
2291 break; | 2448 break; |
2292 } | 2449 } |
2293 | 2450 |
2294 default: | 2451 default: |
2295 av_log(matroska->ctx, AV_LOG_INFO, | 2452 av_log(matroska->ctx, AV_LOG_INFO, |