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,