Changeset 263
- Timestamp:
- Nov 20, 2006, 9:45:29 PM (18 years ago)
- Location:
- trunk
- Files:
-
- 102 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/audio/adecode.c ¶
r261 r263 768 768 769 769 RecAudioBuffer = Buffer; 770 //printf(" %i\n",BufferSize);770 //printf("cb: %i\n",BufferSize); 771 771 772 772 return BufferSize; … … 1261 1261 case CODEC_FFMPEG: 1262 1262 { 1263 int need_parser = 0; 1263 1264 avcodec_init(); 1264 1265 avcodec_register_all(); … … 1281 1282 case AUDIO_MP3: 1282 1283 audio_codec = (AVCodec *)avcodec_find_decoder(CODEC_ID_MP3); 1283 if (audio_codec) 1284 av_parser = av_parser_init(audio_codec->id); 1284 need_parser = 1; 1285 1285 break; 1286 1286 1287 1287 case AUDIO_MP2: 1288 1288 audio_codec = (AVCodec *)avcodec_find_decoder(CODEC_ID_MP2); 1289 //need_parser = 1; 1289 1290 break; 1290 1291 … … 1359 1360 } 1360 1361 1362 if (need_parser) 1363 av_parser = av_parser_init(audio_codec->id); 1361 1364 // memset(audio_context, 0, sizeof(AVCodecContext)); 1362 1365 sh_audio->audio_out_minsize=AVCODEC_MAX_AUDIO_FRAME_SIZE; … … 1384 1387 if (!audio_context->bits_per_sample) 1385 1388 audio_context->bits_per_sample = 1; 1389 //if (!audio_context->sample_rate) 1390 // audio_context->sample_rate = 48000; 1386 1391 audio_context->codec_tag = sh_audio->format; 1387 1392 audio_context->codec_id = audio_codec->id; … … 1423 1428 sr = audio_context->sample_rate; 1424 1429 if (!sh_audio->i_bps) sh_audio->i_bps = 1; // temporary 1425 max_count = 1000;1430 max_count = 3; 1426 1431 while (i < max_count) 1427 1432 { … … 1502 1507 } 1503 1508 } 1509 if (!sh_audio->samplerate) 1510 sh_audio->samplerate = 48000; 1504 1511 break; 1505 1512 } … … 1594 1601 #endif 1595 1602 } 1603 audio_reset(); 1596 1604 // audio_header.sample_rate *= PlaySpeed; 1597 1605 if (sh_audio->samplesize) … … 1837 1845 memset(sh_audio->codec,0,sizeof(codecs_st)); 1838 1846 } 1847 1848 /*printf("cp2\n");fflush(stdout);*/ 1839 1849 } 1840 1850 … … 2250 2260 2251 2261 //sh_audio->a_in_buffer_len += /*-1*/enc_len; 2252 #if 1 2262 //fprintf(stderr, "header: 0x%08X\n", *(unsigned int*)data); 2263 #if 0 2253 2264 hdr = 0; 2254 2265 // get mp2/mp3 header … … 2314 2325 parse_data = NULL; 2315 2326 parse_size = 0; 2316 if (av_parser->parser->parser_init)2317 av_parser->parser->parser_init(av_parser);2327 // if (av_parser->parser->parser_init) 2328 // av_parser->parser->parser_init(av_parser); 2318 2329 2319 2330 parse_again: … … 2322 2333 &parse_data, &parse_size, 2323 2334 data, enc_len, 2324 //AV_NOPTS_VALUE, AV_NOPTS_VALUE);2325 av_pts, av_dts);2335 AV_NOPTS_VALUE, AV_NOPTS_VALUE); 2336 //av_pts, av_dts); 2326 2337 #if 0 2327 2338 printf("data: %x, enclen: %i, p data: %x, p size: %i, p len: %i\n", … … 2338 2349 //enc_len -= parse_len; 2339 2350 //goto new_packet; 2340 return 0; 2351 dprintf("AUDIO PARSER: Wrong parser size\n"); 2352 //return 0; 2341 2353 } else 2342 2354 { 2355 dprintf("AUDIO PARSER: parser len: %i. enc len: %i\n", parse_len, enc_len); 2343 2356 if (enc_len == parse_len) 2344 2357 { … … 2349 2362 data += parse_len; 2350 2363 enc_len -= parse_len; 2364 2351 2365 } 2352 2366 } -
TabularUnified trunk/gui/guieng/loadpng.cpp ¶
r64 r263 1435 1435 1436 1436 /* Table of CRCs of all 8-bit messages. */ 1437 unsigned longcrc_table[256] =1437 unsigned int crc_table[256] = 1438 1438 { 1439 1439 0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, -
TabularUnified trunk/gui/play.hpp ¶
r262 r263 2003 2003 no_audio = FALSE; 2004 2004 no_video = FALSE; 2005 // printf("releasing: demuxer and stream closed\n");fflush(stdout);2006 2005 if (videobuffer!=NULL) 2007 2006 { … … 2378 2377 ppl->demuxerType = demuxerM->type; 2379 2378 2380 if ((demuxerM->type == DEMUXER_TYPE_AVI_NI) ||2381 (demuxerM->type == DEMUXER_TYPE_AVI_NINI) ||2382 (demuxerM->type == DEMUXER_TYPE_MOV) ||2383 (CacheEnabled == FALSE))2384 {2385 printf("Cache disabled\n");2386 cache_disable();2387 }2388 2389 2379 if (!justprop) 2390 2380 { … … 2443 2433 } 2444 2434 } 2435 2436 if ((demuxerM->type == DEMUXER_TYPE_AVI_NI) || 2437 (demuxerM->type == DEMUXER_TYPE_AVI_NINI) || 2438 (demuxerM->type == DEMUXER_TYPE_MOV) || 2439 (CacheEnabled == FALSE) || 2440 (demuxerM->type == DEMUXER_TYPE_LAVF && sh_video && 2441 (sh_video->format == mmioFOURCC('S','V','Q','3') || 2442 sh_video->format == mmioFOURCC('S','V','Q','1') || 2443 sh_video->format == mmioFOURCC('V','P','3','1')))) 2444 { 2445 printf("Cache disabled\n"); 2446 cache_disable(); 2447 } 2445 2448 if (hWndShowClient) 2446 2449 WinPostMsg(hWndShowClient,WM_COMMAND, MPFROM2SHORT(IDM_REPAINT,0L),NULL); … … 3068 3071 // printf("audfree 1\n");fflush(stdout); 3069 3072 if (!no_video && sh_video) video_close(sh_video); 3070 3071 3073 StreamRelease(); 3072 3074 -
TabularUnified trunk/gui/version.h ¶
r262 r263 1 #define VERSION " 9Nov 2006"1 #define VERSION "20 Nov 2006" -
TabularUnified trunk/gui/video2.hpp ¶
r259 r263 376 376 sub_data* subtitles=NULL; 377 377 subtitle* sub_curr=NULL; 378 int dvdsub_id=-2; 378 379 extern subtitle* vo_sub; 379 380 extern int vo_sub_changed; -
TabularUnified trunk/libavcodec/8bps.c ¶
r256 r263 40 40 41 41 42 const enum PixelFormat pixfmt_rgb24[] = {PIX_FMT_BGR24, PIX_FMT_RGBA32, -1};42 static const enum PixelFormat pixfmt_rgb24[] = {PIX_FMT_BGR24, PIX_FMT_RGBA32, -1}; 43 43 44 44 /* -
TabularUnified trunk/libavcodec/allcodecs.c ¶
r261 r263 470 470 register_avcodec(&sonic_decoder); 471 471 #endif //CONFIG_SONIC_DECODER 472 #ifdef CONFIG_A C3472 #ifdef CONFIG_A52 473 473 #ifdef CONFIG_AC3_DECODER 474 474 register_avcodec(&ac3_decoder); … … 870 870 av_register_bitstream_filter(&remove_extradata_bsf); 871 871 av_register_bitstream_filter(&noise_bsf); 872 av_register_bitstream_filter(&mp3_header_compress_bsf); 873 av_register_bitstream_filter(&mp3_header_decompress_bsf); 872 874 } 873 875 -
TabularUnified trunk/libavcodec/avcodec.h ¶
r262 r263 31 31 extern "C" { 32 32 #endif 33 33 34 #include "config.h" 34 35 #include "avutil.h" … … 2663 2664 extern AVBitStreamFilter remove_extradata_bsf; 2664 2665 extern AVBitStreamFilter noise_bsf; 2666 extern AVBitStreamFilter mp3_header_compress_bsf; 2667 extern AVBitStreamFilter mp3_header_decompress_bsf; 2665 2668 2666 2669 -
TabularUnified trunk/libavcodec/bitstream_filter.c ¶
r256 r263 20 20 21 21 #include "avcodec.h" 22 #include "mpegaudio.h" 22 23 23 24 AVBitStreamFilter *first_bitstream_filter= NULL; … … 125 126 } 126 127 128 #define MP3_MASK 0xFFFE0CCF 129 130 static int mp3_header_compress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, 131 uint8_t **poutbuf, int *poutbuf_size, 132 const uint8_t *buf, int buf_size, int keyframe){ 133 uint32_t header, extraheader; 134 int mode_extension, header_size; 135 136 if(avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL){ 137 av_log(avctx, AV_LOG_ERROR, "not standards compliant\n"); 138 return -1; 139 } 140 141 header = BE_32(buf); 142 mode_extension= (header>>4)&3; 143 144 if(ff_mpa_check_header(header) < 0 || (header&0x60000) != 0x20000){ 145 output_unchanged: 146 *poutbuf= (uint8_t *) buf; 147 *poutbuf_size= buf_size; 148 149 av_log(avctx, AV_LOG_INFO, "cannot compress %08X\n", header); 150 return 0; 151 } 152 153 if(avctx->extradata_size == 0){ 154 avctx->extradata_size=15; 155 avctx->extradata= av_malloc(avctx->extradata_size); 156 strcpy(avctx->extradata, "FFCMP3 0.0"); 157 memcpy(avctx->extradata+11, buf, 4); 158 } 159 if(avctx->extradata_size != 15){ 160 av_log(avctx, AV_LOG_ERROR, "Extradata invalid\n"); 161 return -1; 162 } 163 extraheader = BE_32(avctx->extradata+11); 164 if((extraheader&MP3_MASK) != (header&MP3_MASK)) 165 goto output_unchanged; 166 167 header_size= (header&0x10000) ? 4 : 6; 168 169 *poutbuf_size= buf_size - header_size; 170 *poutbuf= av_malloc(buf_size - header_size + FF_INPUT_BUFFER_PADDING_SIZE); 171 memcpy(*poutbuf, buf + header_size, buf_size - header_size + FF_INPUT_BUFFER_PADDING_SIZE); 172 173 if(avctx->channels==2){ 174 if((header & (3<<19)) != 3<<19){ 175 (*poutbuf)[1] &= 0x3F; 176 (*poutbuf)[1] |= mode_extension<<6; 177 FFSWAP(int, (*poutbuf)[1], (*poutbuf)[2]); 178 }else{ 179 (*poutbuf)[1] &= 0x8F; 180 (*poutbuf)[1] |= mode_extension<<4; 181 } 182 } 183 184 return 1; 185 } 186 187 static int mp3_header_decompress(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args, 188 uint8_t **poutbuf, int *poutbuf_size, 189 const uint8_t *buf, int buf_size, int keyframe){ 190 uint32_t header; 191 int sample_rate= avctx->sample_rate; 192 int sample_rate_index=0; 193 int lsf, mpeg25, bitrate_index, frame_size; 194 195 header = BE_32(buf); 196 if(ff_mpa_check_header(header) >= 0){ 197 *poutbuf= (uint8_t *) buf; 198 *poutbuf_size= buf_size; 199 200 return 0; 201 } 202 203 if(avctx->extradata_size != 15 || strcmp(avctx->extradata, "FFCMP3 0.0")){ 204 av_log(avctx, AV_LOG_ERROR, "Extradata invalid %d\n", avctx->extradata_size); 205 return -1; 206 } 207 208 header= BE_32(avctx->extradata+11) & MP3_MASK; 209 210 lsf = sample_rate < (24000+32000)/2; 211 mpeg25 = sample_rate < (12000+16000)/2; 212 sample_rate_index= (header>>10)&3; 213 sample_rate= mpa_freq_tab[sample_rate_index] >> (lsf + mpeg25); //in case sample rate is a little off 214 215 for(bitrate_index=2; bitrate_index<30; bitrate_index++){ 216 frame_size = mpa_bitrate_tab[lsf][2][bitrate_index>>1]; 217 frame_size = (frame_size * 144000) / (sample_rate << lsf) + (bitrate_index&1); 218 if(frame_size == buf_size + 4) 219 break; 220 if(frame_size == buf_size + 6) 221 break; 222 } 223 if(bitrate_index == 30){ 224 av_log(avctx, AV_LOG_ERROR, "couldnt find bitrate_index\n"); 225 return -1; 226 } 227 228 header |= (bitrate_index&1)<<9; 229 header |= (bitrate_index>>1)<<12; 230 header |= (frame_size == buf_size + 4)<<16; //FIXME actually set a correct crc instead of 0 231 232 *poutbuf_size= frame_size; 233 *poutbuf= av_malloc(frame_size + FF_INPUT_BUFFER_PADDING_SIZE); 234 memcpy(*poutbuf + frame_size - buf_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE); 235 236 if(avctx->channels==2){ 237 uint8_t *p= *poutbuf + frame_size - buf_size; 238 if(lsf){ 239 FFSWAP(int, p[1], p[2]); 240 header |= (p[1] & 0xC0)>>2; 241 p[1] &= 0x3F; 242 }else{ 243 header |= p[1] & 0x30; 244 p[1] &= 0xCF; 245 } 246 } 247 248 (*poutbuf)[0]= header>>24; 249 (*poutbuf)[1]= header>>16; 250 (*poutbuf)[2]= header>> 8; 251 (*poutbuf)[3]= header ; 252 253 return 1; 254 } 255 127 256 AVBitStreamFilter dump_extradata_bsf={ 128 257 "dump_extra", … … 142 271 noise, 143 272 }; 273 274 AVBitStreamFilter mp3_header_compress_bsf={ 275 "mp3comp", 276 0, 277 mp3_header_compress, 278 }; 279 280 AVBitStreamFilter mp3_header_decompress_bsf={ 281 "mp3decomp", 282 0, 283 mp3_header_decompress, 284 }; -
TabularUnified trunk/libavcodec/cavs.c ¶
r256 r263 32 32 #include "cavsdata.h" 33 33 34 #ifdef CONFIG_CAVS_DECODER 34 35 typedef struct { 35 36 MpegEncContext s; … … 294 295 int ih = 0; 295 296 int iv = 0; 296 uint8_t *cm = cropTbl + MAX_NEG_CROP;297 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 297 298 298 299 for(x=0; x<4; x++) { … … 1319 1320 } 1320 1321 1321 /** 1322 * finds the end of the current frame in the bitstream. 1323 * @return the position of the first byte of the next frame, or -1 1324 */ 1325 int ff_cavs_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size) { 1326 int pic_found, i; 1327 uint32_t state; 1328 1329 pic_found= pc->frame_start_found; 1330 state= pc->state; 1331 1332 i=0; 1333 if(!pic_found){ 1334 for(i=0; i<buf_size; i++){ 1335 state= (state<<8) | buf[i]; 1336 if(state == PIC_I_START_CODE || state == PIC_PB_START_CODE){ 1337 i++; 1338 pic_found=1; 1339 break; 1340 } 1341 } 1342 } 1343 1344 if(pic_found){ 1345 /* EOF considered as end of frame */ 1346 if (buf_size == 0) 1347 return 0; 1348 for(; i<buf_size; i++){ 1349 state= (state<<8) | buf[i]; 1350 if((state&0xFFFFFF00) == 0x100){ 1351 if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){ 1352 pc->frame_start_found=0; 1353 pc->state=-1; 1354 return i-3; 1355 } 1356 } 1357 } 1358 } 1359 pc->frame_start_found= pic_found; 1360 pc->state= state; 1361 return END_NOT_FOUND; 1362 } 1363 1364 void ff_cavs_flush(AVCodecContext * avctx) { 1322 static void cavs_flush(AVCodecContext * avctx) { 1365 1323 AVSContext *h = avctx->priv_data; 1366 1324 h->got_keyframe = 0; … … 1499 1457 cavs_decode_frame, 1500 1458 CODEC_CAP_DR1 | CODEC_CAP_DELAY, 1501 .flush= ff_cavs_flush,1459 .flush= cavs_flush, 1502 1460 }; 1461 #endif /* CONFIG_CAVS_DECODER */ 1462 1463 #ifdef CONFIG_CAVSVIDEO_PARSER 1464 /** 1465 * finds the end of the current frame in the bitstream. 1466 * @return the position of the first byte of the next frame, or -1 1467 */ 1468 static int cavs_find_frame_end(ParseContext *pc, const uint8_t *buf, 1469 int buf_size) { 1470 int pic_found, i; 1471 uint32_t state; 1472 1473 pic_found= pc->frame_start_found; 1474 state= pc->state; 1475 1476 i=0; 1477 if(!pic_found){ 1478 for(i=0; i<buf_size; i++){ 1479 state= (state<<8) | buf[i]; 1480 if(state == PIC_I_START_CODE || state == PIC_PB_START_CODE){ 1481 i++; 1482 pic_found=1; 1483 break; 1484 } 1485 } 1486 } 1487 1488 if(pic_found){ 1489 /* EOF considered as end of frame */ 1490 if (buf_size == 0) 1491 return 0; 1492 for(; i<buf_size; i++){ 1493 state= (state<<8) | buf[i]; 1494 if((state&0xFFFFFF00) == 0x100){ 1495 if(state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE){ 1496 pc->frame_start_found=0; 1497 pc->state=-1; 1498 return i-3; 1499 } 1500 } 1501 } 1502 } 1503 pc->frame_start_found= pic_found; 1504 pc->state= state; 1505 return END_NOT_FOUND; 1506 } 1507 1508 static int cavsvideo_parse(AVCodecParserContext *s, 1509 AVCodecContext *avctx, 1510 uint8_t **poutbuf, int *poutbuf_size, 1511 const uint8_t *buf, int buf_size) 1512 { 1513 ParseContext *pc = s->priv_data; 1514 int next; 1515 1516 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){ 1517 next= buf_size; 1518 }else{ 1519 next= cavs_find_frame_end(pc, buf, buf_size); 1520 1521 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) { 1522 *poutbuf = NULL; 1523 *poutbuf_size = 0; 1524 return buf_size; 1525 } 1526 } 1527 *poutbuf = (uint8_t *)buf; 1528 *poutbuf_size = buf_size; 1529 return next; 1530 } 1531 1532 AVCodecParser cavsvideo_parser = { 1533 { CODEC_ID_CAVS }, 1534 sizeof(ParseContext1), 1535 NULL, 1536 cavsvideo_parse, 1537 ff_parse1_close, 1538 ff_mpeg4video_split, 1539 }; 1540 #endif /* CONFIG_CAVSVIDEO_PARSER */ -
TabularUnified trunk/libavcodec/cavsdata.h ¶
r256 r263 132 132 }; 133 133 134 #ifdef CONFIG_CAVS_DECODER 134 135 static const uint8_t partition_flags[30] = { 135 136 0, //I_8X8 … … 640 641 static const int_fast8_t left_modifier_c[7] = { 5,-1, 2,-1, 6, 5, 6}; 641 642 static const int_fast8_t top_modifier_c[7] = { 4, 1,-1,-1, 4, 6, 6}; 643 #endif /* CONFIG_CAVS_DECODER */ -
TabularUnified trunk/libavcodec/cavsdsp.c ¶
r256 r263 185 185 int i; 186 186 DCTELEM (*src)[8] = (DCTELEM(*)[8])block; 187 uint8_t *cm = cropTbl + MAX_NEG_CROP;187 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 188 188 189 189 src[0][0] += 8; … … 261 261 static void OPNAME ## cavs_filt8_h_ ## NAME(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ 262 262 const int h=8;\ 263 uint8_t *cm = cropTbl + MAX_NEG_CROP;\263 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 264 264 int i;\ 265 265 for(i=0; i<h; i++)\ … … 280 280 static void OPNAME ## cavs_filt8_v_ ## NAME(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ 281 281 const int w=8;\ 282 uint8_t *cm = cropTbl + MAX_NEG_CROP;\282 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 283 283 int i;\ 284 284 for(i=0; i<w; i++)\ … … 334 334 const int h=8;\ 335 335 const int w=8;\ 336 uint8_t *cm = cropTbl + MAX_NEG_CROP;\336 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 337 337 int i;\ 338 338 src1 -= 2*srcStride;\ -
TabularUnified trunk/libavcodec/dsputil.c ¶
r257 r263 41 41 void vorbis_inverse_coupling(float *mag, float *ang, int blocksize); 42 42 43 uint8_t cropTbl[256 + 2 * MAX_NEG_CROP] = {0, };44 uint32_t squareTbl[512] = {0, };43 uint8_t ff_cropTbl[256 + 2 * MAX_NEG_CROP] = {0, }; 44 uint32_t ff_squareTbl[512] = {0, }; 45 45 46 46 const uint8_t ff_zigzag_direct[64] = { … … 94 94 95 95 /* a*inverse[b]>>32 == a/b for all 0<=a<=65536 && 2<=b<=255 */ 96 const uint32_t inverse[256]={96 const uint32_t ff_inverse[256]={ 97 97 0, 4294967295U,2147483648U,1431655766, 1073741824, 858993460, 715827883, 613566757, 98 98 536870912, 477218589, 429496730, 390451573, 357913942, 330382100, 306783379, 286331154, … … 166 166 { 167 167 int s, i, j; 168 uint32_t *sq = squareTbl + 256;168 uint32_t *sq = ff_squareTbl + 256; 169 169 170 170 s = 0; … … 232 232 { 233 233 int s, i; 234 uint32_t *sq = squareTbl + 256;234 uint32_t *sq = ff_squareTbl + 256; 235 235 236 236 s = 0; … … 249 249 { 250 250 int s, i; 251 uint32_t *sq = squareTbl + 256;251 uint32_t *sq = ff_squareTbl + 256; 252 252 253 253 s = 0; … … 270 270 { 271 271 int s, i; 272 uint32_t *sq = squareTbl + 256;272 uint32_t *sq = ff_squareTbl + 256; 273 273 274 274 s = 0; … … 437 437 { 438 438 int i; 439 uint8_t *cm = cropTbl + MAX_NEG_CROP;439 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 440 440 441 441 /* read the pixels */ … … 459 459 { 460 460 int i; 461 uint8_t *cm = cropTbl + MAX_NEG_CROP;461 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 462 462 463 463 /* read the pixels */ … … 477 477 { 478 478 int i; 479 uint8_t *cm = cropTbl + MAX_NEG_CROP;479 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 480 480 481 481 /* read the pixels */ … … 514 514 { 515 515 int i; 516 uint8_t *cm = cropTbl + MAX_NEG_CROP;516 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 517 517 518 518 /* read the pixels */ … … 535 535 { 536 536 int i; 537 uint8_t *cm = cropTbl + MAX_NEG_CROP;537 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 538 538 539 539 /* read the pixels */ … … 552 552 { 553 553 int i; 554 uint8_t *cm = cropTbl + MAX_NEG_CROP;554 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 555 555 556 556 /* read the pixels */ … … 1593 1593 #define QPEL_MC(r, OPNAME, RND, OP) \ 1594 1594 static void OPNAME ## mpeg4_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\ 1595 uint8_t *cm = cropTbl + MAX_NEG_CROP;\1595 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 1596 1596 int i;\ 1597 1597 for(i=0; i<h; i++)\ … … 1612 1612 static void OPNAME ## mpeg4_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ 1613 1613 const int w=8;\ 1614 uint8_t *cm = cropTbl + MAX_NEG_CROP;\1614 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 1615 1615 int i;\ 1616 1616 for(i=0; i<w; i++)\ … … 1639 1639 \ 1640 1640 static void OPNAME ## mpeg4_qpel16_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\ 1641 uint8_t *cm = cropTbl + MAX_NEG_CROP;\1641 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 1642 1642 int i;\ 1643 1643 \ … … 1666 1666 \ 1667 1667 static void OPNAME ## mpeg4_qpel16_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ 1668 uint8_t *cm = cropTbl + MAX_NEG_CROP;\1668 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 1669 1669 int i;\ 1670 1670 const int w=16;\ … … 2092 2092 static void OPNAME ## h264_qpel2_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ 2093 2093 const int h=2;\ 2094 uint8_t *cm = cropTbl + MAX_NEG_CROP;\2094 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 2095 2095 int i;\ 2096 2096 for(i=0; i<h; i++)\ … … 2105 2105 static void OPNAME ## h264_qpel2_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ 2106 2106 const int w=2;\ 2107 uint8_t *cm = cropTbl + MAX_NEG_CROP;\2107 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 2108 2108 int i;\ 2109 2109 for(i=0; i<w; i++)\ … … 2126 2126 const int h=2;\ 2127 2127 const int w=2;\ 2128 uint8_t *cm = cropTbl + MAX_NEG_CROP;\2128 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 2129 2129 int i;\ 2130 2130 src -= 2*srcStride;\ … … 2154 2154 static void OPNAME ## h264_qpel4_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ 2155 2155 const int h=4;\ 2156 uint8_t *cm = cropTbl + MAX_NEG_CROP;\2156 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 2157 2157 int i;\ 2158 2158 for(i=0; i<h; i++)\ … … 2169 2169 static void OPNAME ## h264_qpel4_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ 2170 2170 const int w=4;\ 2171 uint8_t *cm = cropTbl + MAX_NEG_CROP;\2171 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 2172 2172 int i;\ 2173 2173 for(i=0; i<w; i++)\ … … 2194 2194 const int h=4;\ 2195 2195 const int w=4;\ 2196 uint8_t *cm = cropTbl + MAX_NEG_CROP;\2196 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 2197 2197 int i;\ 2198 2198 src -= 2*srcStride;\ … … 2229 2229 static void OPNAME ## h264_qpel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ 2230 2230 const int h=8;\ 2231 uint8_t *cm = cropTbl + MAX_NEG_CROP;\2231 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 2232 2232 int i;\ 2233 2233 for(i=0; i<h; i++)\ … … 2248 2248 static void OPNAME ## h264_qpel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\ 2249 2249 const int w=8;\ 2250 uint8_t *cm = cropTbl + MAX_NEG_CROP;\2250 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 2251 2251 int i;\ 2252 2252 for(i=0; i<w; i++)\ … … 2281 2281 const int h=8;\ 2282 2282 const int w=8;\ 2283 uint8_t *cm = cropTbl + MAX_NEG_CROP;\2283 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;\ 2284 2284 int i;\ 2285 2285 src -= 2*srcStride;\ … … 2583 2583 2584 2584 static void wmv2_mspel8_h_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){ 2585 uint8_t *cm = cropTbl + MAX_NEG_CROP;2585 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 2586 2586 int i; 2587 2587 … … 2628 2628 2629 2629 static void wmv2_mspel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int w){ 2630 uint8_t *cm = cropTbl + MAX_NEG_CROP;2630 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 2631 2631 int i; 2632 2632 … … 3848 3848 static void ff_jref_idct1_put(uint8_t *dest, int line_size, DCTELEM *block) 3849 3849 { 3850 uint8_t *cm = cropTbl + MAX_NEG_CROP;3850 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 3851 3851 3852 3852 dest[0] = cm[(block[0] + 4)>>3]; … … 3854 3854 static void ff_jref_idct1_add(uint8_t *dest, int line_size, DCTELEM *block) 3855 3855 { 3856 uint8_t *cm = cropTbl + MAX_NEG_CROP;3856 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 3857 3857 3858 3858 dest[0] = cm[dest[0] + ((block[0] + 4)>>3)]; … … 3866 3866 int i; 3867 3867 3868 for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;3868 for(i=0;i<256;i++) ff_cropTbl[i + MAX_NEG_CROP] = i; 3869 3869 for(i=0;i<MAX_NEG_CROP;i++) { 3870 cropTbl[i] = 0;3871 cropTbl[i + MAX_NEG_CROP + 256] = 255;3870 ff_cropTbl[i] = 0; 3871 ff_cropTbl[i + MAX_NEG_CROP + 256] = 255; 3872 3872 } 3873 3873 3874 3874 for(i=0;i<512;i++) { 3875 squareTbl[i] = (i - 256) * (i - 256);3875 ff_squareTbl[i] = (i - 256) * (i - 256); 3876 3876 } 3877 3877 -
TabularUnified trunk/libavcodec/dsputil.h ¶
r256 r263 75 75 76 76 /* temporary */ 77 extern uint32_t squareTbl[512];78 extern uint8_t cropTbl[256 + 2 * MAX_NEG_CROP];77 extern uint32_t ff_squareTbl[512]; 78 extern uint8_t ff_cropTbl[256 + 2 * MAX_NEG_CROP]; 79 79 80 80 /* VP3 DSP functions */ -
TabularUnified trunk/libavcodec/dtsdec.c ¶
r256 r263 56 56 } 57 57 58 void58 static void 59 59 convert2s16_2 (sample_t * _f, int16_t * s16) 60 60 { … … 69 69 } 70 70 71 void71 static void 72 72 convert2s16_4 (sample_t * _f, int16_t * s16) 73 73 { … … 84 84 } 85 85 86 void86 static void 87 87 convert2s16_5 (sample_t * _f, int16_t * s16) 88 88 { -
TabularUnified trunk/libavcodec/dvbsubdec.c ¶
r261 r263 345 345 DVBSubContext *ctx = (DVBSubContext*) avctx->priv_data; 346 346 347 cm = cropTbl + MAX_NEG_CROP;347 cm = ff_cropTbl + MAX_NEG_CROP; 348 348 349 349 memset(avctx->priv_data, 0, sizeof(DVBSubContext)); -
TabularUnified trunk/libavcodec/error_resilience.c ¶
r257 r263 200 200 static void h_block_filter(MpegEncContext *s, uint8_t *dst, int w, int h, int stride, int is_luma){ 201 201 int b_x, b_y; 202 uint8_t *cm = cropTbl + MAX_NEG_CROP;202 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 203 203 204 204 for(b_y=0; b_y<h; b_y++){ … … 260 260 static void v_block_filter(MpegEncContext *s, uint8_t *dst, int w, int h, int stride, int is_luma){ 261 261 int b_x, b_y; 262 uint8_t *cm = cropTbl + MAX_NEG_CROP;262 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 263 263 264 264 for(b_y=0; b_y<h-1; b_y++){ -
TabularUnified trunk/libavcodec/faac.c ¶
r256 r263 96 96 } 97 97 98 int Faac_encode_frame(AVCodecContext *avctx,99 unsigned char *frame, int buf_size, void *data)98 static int Faac_encode_frame(AVCodecContext *avctx, 99 unsigned char *frame, int buf_size, void *data) 100 100 { 101 101 FaacAudioContext *s = avctx->priv_data; … … 111 111 } 112 112 113 int Faac_encode_close(AVCodecContext *avctx)113 static int Faac_encode_close(AVCodecContext *avctx) 114 114 { 115 115 FaacAudioContext *s = avctx->priv_data; -
TabularUnified trunk/libavcodec/flicvideo.c ¶
r259 r263 157 157 signed short line_packets; 158 158 int y_ptr; 159 signed charbyte_run;159 int byte_run; 160 160 int pixel_skip; 161 161 int pixel_countdown; … … 259 259 pixel_ptr += pixel_skip; 260 260 pixel_countdown -= pixel_skip; 261 byte_run = buf[stream_ptr++];261 byte_run = (signed char)(buf[stream_ptr++]); 262 262 if (byte_run < 0) { 263 263 byte_run = -byte_run; … … 302 302 pixel_ptr += pixel_skip; 303 303 pixel_countdown -= pixel_skip; 304 byte_run = buf[stream_ptr++];304 byte_run = (signed char)(buf[stream_ptr++]); 305 305 if (byte_run > 0) { 306 306 CHECK_PIXEL_PTR(byte_run); … … 342 342 pixel_countdown = s->avctx->width; 343 343 while (pixel_countdown > 0) { 344 byte_run = buf[stream_ptr++];344 byte_run = (signed char)(buf[stream_ptr++]); 345 345 if (byte_run > 0) { 346 346 palette_idx1 = buf[stream_ptr++]; … … 444 444 signed short line_packets; 445 445 int y_ptr; 446 signed charbyte_run;446 int byte_run; 447 447 int pixel_skip; 448 448 int pixel_countdown; … … 504 504 pixel_ptr += (pixel_skip*2); /* Pixel is 2 bytes wide */ 505 505 pixel_countdown -= pixel_skip; 506 byte_run = buf[stream_ptr++];506 byte_run = (signed char)(buf[stream_ptr++]); 507 507 if (byte_run < 0) { 508 508 byte_run = -byte_run; … … 550 550 551 551 while (pixel_countdown > 0) { 552 byte_run = buf[stream_ptr++];552 byte_run = (signed char)(buf[stream_ptr++]); 553 553 if (byte_run > 0) { 554 554 palette_idx1 = buf[stream_ptr++]; … … 604 604 605 605 while (pixel_countdown > 0) { 606 byte_run = buf[stream_ptr++];606 byte_run = (signed char)(buf[stream_ptr++]); 607 607 if (byte_run > 0) { 608 608 pixel = LE_16(&buf[stream_ptr]); -
TabularUnified trunk/libavcodec/h261.c ¶
r256 r263 78 78 } 79 79 80 staticint ff_h261_get_picture_format(int width, int height){80 int ff_h261_get_picture_format(int width, int height){ 81 81 // QCIF 82 82 if (width == 176 && height == 144) -
TabularUnified trunk/libavcodec/h261data.h ¶
r256 r263 27 27 28 28 // H.261 VLC table for macroblock addressing 29 const uint8_t h261_mba_code[35] = {29 static const uint8_t h261_mba_code[35] = { 30 30 1, 3, 2, 3, 31 31 2, 3, 2, 7, … … 41 41 }; 42 42 43 const uint8_t h261_mba_bits[35] = {43 static const uint8_t h261_mba_bits[35] = { 44 44 1, 3, 3, 4, 45 45 4, 5, 5, 7, … … 56 56 57 57 //H.261 VLC table for macroblock type 58 const uint8_t h261_mtype_code[10] = {58 static const uint8_t h261_mtype_code[10] = { 59 59 1, 1, 1, 1, 60 60 1, 1, 1, 1, … … 62 62 }; 63 63 64 const uint8_t h261_mtype_bits[10] = {64 static const uint8_t h261_mtype_bits[10] = { 65 65 4, 7, 1, 5, 66 66 9, 8, 10, 3, … … 82 82 83 83 //H.261 VLC table for motion vectors 84 const uint8_t h261_mv_tab[17][2] = {84 static const uint8_t h261_mv_tab[17][2] = { 85 85 {1,1}, {1,2}, {1,3}, {1,4}, {3,6}, {5,7}, {4,7}, {3,7}, 86 86 {11,9}, {10,9}, {9,9}, {17,10}, {16,10}, {15,10}, {14,10}, {13,10}, {12,10} … … 93 93 94 94 //H.261 VLC table for coded block pattern 95 const uint8_t h261_cbp_tab[63][2] =95 static const uint8_t h261_cbp_tab[63][2] = 96 96 { 97 97 {11,5}, {9,5}, {13,6}, {13,4}, {23,7}, {19,7}, {31,8}, {12,4}, … … 106 106 107 107 //H.261 VLC table for transform coefficients 108 const uint16_t h261_tcoeff_vlc[65][2] = {108 static const uint16_t h261_tcoeff_vlc[65][2] = { 109 109 { 0x2, 2 }, { 0x3, 2 },{ 0x4, 4 },{ 0x5, 5 }, 110 110 { 0x6, 7 },{ 0x26, 8 },{ 0x21, 8 },{ 0xa, 10 }, … … 126 126 }; 127 127 128 const int8_t h261_tcoeff_level[64] = {128 static const int8_t h261_tcoeff_level[64] = { 129 129 0, 1, 2, 3, 4, 5, 6, 7, 130 130 8, 9, 10, 11, 12, 13, 14, 15, … … 137 137 }; 138 138 139 const int8_t h261_tcoeff_run[64] = {139 static const int8_t h261_tcoeff_run[64] = { 140 140 0, 141 141 0, 0, 0, 0, 0, 0, 0, 0, -
TabularUnified trunk/libavcodec/h263data.h ¶
r256 r263 89 89 }; 90 90 91 const uint8_t cbpc_b_tab[4][2] = {91 static const uint8_t cbpc_b_tab[4][2] = { 92 92 {0, 1}, 93 93 {2, 2}, … … 181 181 }; 182 182 183 const uint16_t intra_vlc_aic[103][2] = {183 static const uint16_t intra_vlc_aic[103][2] = { 184 184 { 0x2, 2 }, { 0x6, 3 }, { 0xe, 4 }, { 0xc, 5 }, 185 185 { 0xd, 5 }, { 0x10, 6 }, { 0x11, 6 }, { 0x12, 6 }, … … 210 210 }; 211 211 212 const int8_t intra_run_aic[102] = {212 static const int8_t intra_run_aic[102] = { 213 213 0, 0, 0, 0, 0, 0, 0, 0, 214 214 0, 0, 0, 0, 0, 0, 0, 0, … … 226 226 }; 227 227 228 const int8_t intra_level_aic[102] = {228 static const int8_t intra_level_aic[102] = { 229 229 1, 2, 3, 4, 5, 6, 7, 8, 230 230 9, 10, 11, 12, 13, 14, 15, 16, -
TabularUnified trunk/libavcodec/h264.c ¶
r262 r263 2452 2452 int i, j, k; 2453 2453 int a; 2454 uint8_t *cm = cropTbl + MAX_NEG_CROP;2454 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 2455 2455 const uint8_t * const src0 = src+7-stride; 2456 2456 const uint8_t *src1 = src+8*stride-1; … … 2595 2595 int j, k; 2596 2596 int a; 2597 uint8_t *cm = cropTbl + MAX_NEG_CROP;2597 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 2598 2598 const uint8_t * const src0 = src+3-stride; 2599 2599 const uint8_t *src1 = src+4*stride-1; -
TabularUnified trunk/libavcodec/h264idct.c ¶
r256 r263 31 31 static always_inline void idct_internal(uint8_t *dst, DCTELEM *block, int stride, int block_stride, int shift, int add){ 32 32 int i; 33 uint8_t *cm = cropTbl + MAX_NEG_CROP;33 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 34 34 35 35 block[0] += 1<<(shift-1); … … 75 75 int i; 76 76 DCTELEM (*src)[8] = (DCTELEM(*)[8])block; 77 uint8_t *cm = cropTbl + MAX_NEG_CROP;77 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 78 78 79 79 block[0] += 32; … … 146 146 void ff_h264_idct_dc_add_c(uint8_t *dst, DCTELEM *block, int stride){ 147 147 int i, j; 148 uint8_t *cm = cropTbl + MAX_NEG_CROP;148 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 149 149 int dc = (block[0] + 32) >> 6; 150 150 for( j = 0; j < 4; j++ ) … … 158 158 void ff_h264_idct8_dc_add_c(uint8_t *dst, DCTELEM *block, int stride){ 159 159 int i, j; 160 uint8_t *cm = cropTbl + MAX_NEG_CROP;160 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 161 161 int dc = (block[0] + 32) >> 6; 162 162 for( j = 0; j < 8; j++ ) -
TabularUnified trunk/libavcodec/i386/dsputil_mmx.c ¶
r261 r263 2668 2668 2669 2669 #define PREFETCH(name, op) \ 2670 void name(void *mem, int stride, int h){\2670 static void name(void *mem, int stride, int h){\ 2671 2671 const uint8_t *p= mem;\ 2672 2672 do{\ … … 3008 3008 } 3009 3009 3010 void float_to_int16_3dnow(int16_t *dst, const float *src, int len){3010 static void float_to_int16_3dnow(int16_t *dst, const float *src, int len){ 3011 3011 // not bit-exact: pf2id uses different rounding than C and SSE 3012 3012 int i; … … 3023 3023 asm volatile("femms"); 3024 3024 } 3025 void float_to_int16_sse(int16_t *dst, const float *src, int len){3025 static void float_to_int16_sse(int16_t *dst, const float *src, int len){ 3026 3026 int i; 3027 3027 for(i=0; i<len; i+=4) { -
TabularUnified trunk/libavcodec/i386/fdct_mmx.c ¶
r256 r263 68 68 static const int32_t fdct_r_row[2] ATTR_ALIGN(8) = {RND_FRW_ROW, RND_FRW_ROW }; 69 69 70 st ruct70 static struct 71 71 { 72 72 const int32_t fdct_r_row_sse2[4] ATTR_ALIGN(16); … … 151 151 }; 152 152 153 st ruct153 static struct 154 154 { 155 155 const int16_t tab_frw_01234567_sse2[256] ATTR_ALIGN(16); -
TabularUnified trunk/libavcodec/i386/mpegvideo_mmx.c ¶
r256 r263 28 28 #include "x86_cpu.h" 29 29 30 extern uint8_t zigzag_direct_noperm[64];31 30 extern uint16_t inv_zigzag_direct16[64]; 32 31 -
TabularUnified trunk/libavcodec/i386/mpegvideo_mmx_template.c ¶
r256 r263 77 77 "mul %%ecx \n\t" 78 78 : "=d" (level), "=a"(dummy) 79 : "a" ((block[0]>>2) + q), "c" ( inverse[q<<1])79 : "a" ((block[0]>>2) + q), "c" (ff_inverse[q<<1]) 80 80 ); 81 81 #else -
TabularUnified trunk/libavcodec/imgconvert.c ¶
r261 r263 186 186 [PIX_FMT_RGB555] = { 187 187 .name = "rgb555", 188 .nb_channels = 4, .is_alpha = 1,188 .nb_channels = 3, 189 189 .color_type = FF_COLOR_RGB, 190 190 .pixel_type = FF_PIXEL_PACKED, … … 270 270 [PIX_FMT_BGR555] = { 271 271 .name = "bgr555", 272 .nb_channels = 4, .is_alpha = 1,272 .nb_channels = 3, 273 273 .color_type = FF_COLOR_RGB, 274 274 .pixel_type = FF_PIXEL_PACKED, … … 1242 1242 { 1243 1243 int i; 1244 uint8_t *cm = cropTbl + MAX_NEG_CROP;1244 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 1245 1245 1246 1246 for(i = 0;i < 256; i++) { … … 1630 1630 } 1631 1631 1632 #define RGBA_IN(r, g, b, a, s)\ 1632 1633 #define RGB_OUT(d, r, g, b)\ 1633 1634 {\ 1634 unsigned int v = ((const uint16_t *)(s))[0];\ 1635 r = bitcopy_n(v >> (10 - 3), 3);\ 1636 g = bitcopy_n(v >> (5 - 3), 3);\ 1637 b = bitcopy_n(v << 3, 3);\ 1638 a = (-(v >> 15)) & 0xff;\ 1639 } 1640 1641 #define RGBA_OUT(d, r, g, b, a)\ 1642 {\ 1643 ((uint16_t *)(d))[0] = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3) | \ 1644 ((a << 8) & 0x8000);\ 1635 ((uint16_t *)(d))[0] = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);\ 1645 1636 } 1646 1637 … … 2061 2052 .convert = rgba32_to_rgb24 2062 2053 }, 2054 [PIX_FMT_BGR24] = { 2055 .convert = rgba32_to_bgr24 2056 }, 2057 [PIX_FMT_RGB565] = { 2058 .convert = rgba32_to_rgb565 2059 }, 2063 2060 [PIX_FMT_RGB555] = { 2064 2061 .convert = rgba32_to_rgb555 … … 2075 2072 }, 2076 2073 [PIX_FMT_BGR24] = { 2074 [PIX_FMT_RGBA32] = { 2075 .convert = bgr24_to_rgba32 2076 }, 2077 2077 [PIX_FMT_RGB24] = { 2078 2078 .convert = bgr24_to_rgb24 … … 2100 2100 }, 2101 2101 [PIX_FMT_RGB565] = { 2102 [PIX_FMT_RGBA32] = { 2103 .convert = rgb565_to_rgba32 2104 }, 2102 2105 [PIX_FMT_RGB24] = { 2103 2106 .convert = rgb565_to_rgb24 … … 2585 2588 ret = get_alpha_info_rgba32(src, width, height); 2586 2589 break; 2587 case PIX_FMT_RGB555:2588 ret = get_alpha_info_rgb555(src, width, height);2589 break;2590 2590 case PIX_FMT_PAL8: 2591 2591 ret = get_alpha_info_pal8(src, width, height); … … 2654 2654 { 2655 2655 #ifndef HAVE_MMX 2656 uint8_t *cm = cropTbl + MAX_NEG_CROP;2656 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 2657 2657 int sum; 2658 2658 … … 2697 2697 { 2698 2698 #ifndef HAVE_MMX 2699 uint8_t *cm = cropTbl + MAX_NEG_CROP;2699 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 2700 2700 int sum; 2701 2701 -
TabularUnified trunk/libavcodec/imgconvert_template.h ¶
r256 r263 30 30 uint8_t *d, *d1, *d2; 31 31 int w, y, cb, cr, r_add, g_add, b_add, width2; 32 uint8_t *cm = cropTbl + MAX_NEG_CROP;32 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 33 33 unsigned int r, g, b; 34 34 … … 124 124 uint8_t *d, *d1, *d2; 125 125 int w, y, cb, cr, r_add, g_add, b_add, width2; 126 uint8_t *cm = cropTbl + MAX_NEG_CROP;126 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 127 127 unsigned int r, g, b; 128 128 … … 411 411 } 412 412 413 #if !defined(FMT_RGBA32) && defined(RGBA_OUT) 413 // RGB24 has optimised routines 414 #if !defined(FMT_RGBA32) && !defined(FMT_RGB24) 414 415 /* alpha support */ 415 416 … … 420 421 uint8_t *d; 421 422 int src_wrap, dst_wrap, j, y; 422 unsigned int v, r, g, b, a; 423 unsigned int v, r, g, b; 424 #ifdef RGBA_OUT 425 unsigned int a; 426 #endif 423 427 424 428 s = src->data[0]; … … 431 435 for(j = 0;j < width; j++) { 432 436 v = ((const uint32_t *)(s))[0]; 433 a = (v >> 24) & 0xff;434 437 r = (v >> 16) & 0xff; 435 438 g = (v >> 8) & 0xff; 436 439 b = v & 0xff; 440 #ifdef RGBA_OUT 441 a = (v >> 24) & 0xff; 437 442 RGBA_OUT(d, r, g, b, a); 443 #else 444 RGB_OUT(d, r, g, b); 445 #endif 438 446 s += 4; 439 447 d += BPP; … … 450 458 uint8_t *d; 451 459 int src_wrap, dst_wrap, j, y; 452 unsigned int r, g, b, a; 460 unsigned int r, g, b; 461 #ifdef RGBA_IN 462 unsigned int a; 463 #endif 453 464 454 465 s = src->data[0]; … … 460 471 for(y=0;y<height;y++) { 461 472 for(j = 0;j < width; j++) { 473 #ifdef RGBA_IN 462 474 RGBA_IN(r, g, b, a, s); 463 475 ((uint32_t *)(d))[0] = (a << 24) | (r << 16) | (g << 8) | b; 476 #else 477 RGB_IN(r, g, b, s); 478 ((uint32_t *)(d))[0] = (0xff << 24) | (r << 16) | (g << 8) | b; 479 #endif 464 480 d += 4; 465 481 s += BPP; … … 470 486 } 471 487 472 #endif /* !defined(FMT_RGBA32) && defined(RGBA_IN)*/488 #endif /* !defined(FMT_RGBA32) */ 473 489 474 490 #ifndef FMT_RGB24 … … 540 556 uint8_t *d, *d1; 541 557 int w, y, cb, cr, r_add, g_add, b_add; 542 uint8_t *cm = cropTbl + MAX_NEG_CROP;558 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 543 559 unsigned int r, g, b; 544 560 … … 573 589 uint8_t *d, *d1; 574 590 int w, y, cb, cr, r_add, g_add, b_add; 575 uint8_t *cm = cropTbl + MAX_NEG_CROP;591 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 576 592 unsigned int r, g, b; 577 593 -
TabularUnified trunk/libavcodec/mjpeg.c ¶
r261 r263 855 855 int lossless; 856 856 int ls; 857 int progressive; 857 858 int rgb; 858 859 int rct; /* standard rct */ … … 886 887 ScanTable scantable; 887 888 void (*idct_put)(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); 889 void (*idct_add)(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/); 888 890 889 891 int restart_interval; … … 942 944 s->scantable= s2.intra_scantable; 943 945 s->idct_put= s2.dsp.idct_put; 946 s->idct_add= s2.dsp.idct_add; 944 947 945 948 s->mpeg_enc_ctx_allocated = 0; … … 1252 1255 } 1253 1256 1257 /* totally blank picture as progressive JPEG will only add details to it */ 1258 if(s->progressive){ 1259 memset(s->picture.data[0], 0, s->picture.linesize[0] * s->height); 1260 memset(s->picture.data[1], 0, s->picture.linesize[1] * s->height >> (s->v_max - s->v_count[1])); 1261 memset(s->picture.data[2], 0, s->picture.linesize[2] * s->height >> (s->v_max - s->v_count[2])); 1262 } 1254 1263 return 0; 1255 1264 } … … 1322 1331 j = s->scantable.permutated[i]; 1323 1332 block[j] = level * quant_matrix[j]; 1333 } 1334 } 1335 CLOSE_READER(re, &s->gb)} 1336 1337 return 0; 1338 } 1339 1340 /* decode block and dequantize - progressive JPEG version */ 1341 static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block, 1342 int component, int dc_index, int ac_index, int16_t *quant_matrix, 1343 int ss, int se, int Ah, int Al, int *EOBRUN) 1344 { 1345 int code, i, j, level, val, run; 1346 1347 /* DC coef */ 1348 if(!ss){ 1349 val = mjpeg_decode_dc(s, dc_index); 1350 if (val == 0xffff) { 1351 dprintf("error dc\n"); 1352 return -1; 1353 } 1354 val = (val * quant_matrix[0] << Al) + s->last_dc[component]; 1355 }else 1356 val = 0; 1357 s->last_dc[component] = val; 1358 block[0] = val; 1359 if(!se) return 0; 1360 /* AC coefs */ 1361 if(*EOBRUN){ 1362 (*EOBRUN)--; 1363 return 0; 1364 } 1365 {OPEN_READER(re, &s->gb) 1366 for(i=ss;;i++) { 1367 UPDATE_CACHE(re, &s->gb); 1368 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2) 1369 /* Progressive JPEG use AC coeffs from zero and this decoder sets offset 16 by default */ 1370 code -= 16; 1371 if(code & 0xF) { 1372 i += ((unsigned) code) >> 4; 1373 code &= 0xf; 1374 if(code > MIN_CACHE_BITS - 16){ 1375 UPDATE_CACHE(re, &s->gb) 1376 } 1377 { 1378 int cache=GET_CACHE(re,&s->gb); 1379 int sign=(~cache)>>31; 1380 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign; 1381 } 1382 1383 LAST_SKIP_BITS(re, &s->gb, code) 1384 1385 if (i >= se) { 1386 if(i == se){ 1387 j = s->scantable.permutated[se]; 1388 block[j] = level * quant_matrix[j] << Al; 1389 break; 1390 } 1391 dprintf("error count: %d\n", i); 1392 return -1; 1393 } 1394 j = s->scantable.permutated[i]; 1395 block[j] = level * quant_matrix[j] << Al; 1396 }else{ 1397 run = ((unsigned) code) >> 4; 1398 if(run == 0xF){// ZRL - skip 15 coefficients 1399 i += 15; 1400 }else{ 1401 val = run; 1402 run = (1 << run); 1403 UPDATE_CACHE(re, &s->gb); 1404 run += (GET_CACHE(re, &s->gb) >> (32 - val)) & (run - 1); 1405 if(val) 1406 LAST_SKIP_BITS(re, &s->gb, val); 1407 *EOBRUN = run - 1; 1408 break; 1409 } 1324 1410 } 1325 1411 } … … 1480 1566 } 1481 1567 1482 static int mjpeg_decode_scan(MJpegDecodeContext *s ){1568 static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int ss, int se, int Ah, int Al){ 1483 1569 int i, mb_x, mb_y; 1484 const int nb_components=3; 1485 1570 int EOBRUN = 0; 1571 1572 if(Ah) return 0; /* TODO decode refinement planes too */ 1486 1573 for(mb_y = 0; mb_y < s->mb_height; mb_y++) { 1487 1574 for(mb_x = 0; mb_x < s->mb_width; mb_x++) { … … 1500 1587 for(j=0;j<n;j++) { 1501 1588 memset(s->block, 0, sizeof(s->block)); 1502 if ( decode_block(s, s->block, i,1589 if (!s->progressive && decode_block(s, s->block, i, 1503 1590 s->dc_index[i], s->ac_index[i], 1504 1591 s->quant_matrixes[ s->quant_index[c] ]) < 0) { 1592 dprintf("error y=%d x=%d\n", mb_y, mb_x); 1593 return -1; 1594 } 1595 if (s->progressive && decode_block_progressive(s, s->block, i, 1596 s->dc_index[i], s->ac_index[i], 1597 s->quant_matrixes[ s->quant_index[c] ], ss, se, Ah, Al, &EOBRUN) < 0) { 1505 1598 dprintf("error y=%d x=%d\n", mb_y, mb_x); 1506 1599 return -1; … … 1513 1606 ptr += s->linesize[c] >> 1; 1514 1607 //av_log(NULL, AV_LOG_DEBUG, "%d %d %d %d %d %d %d %d \n", mb_x, mb_y, x, y, c, s->bottom_field, (v * mb_y + y) * 8, (h * mb_x + x) * 8); 1515 s->idct_put(ptr, s->linesize[c], s->block); 1608 if(!s->progressive) 1609 s->idct_put(ptr, s->linesize[c], s->block); 1610 else 1611 s->idct_add(ptr, s->linesize[c], s->block); 1516 1612 if (++x == h) { 1517 1613 x = 0; … … 1538 1634 int vmax, hmax, index, id; 1539 1635 const int block_size= s->lossless ? 1 : 8; 1540 int ilv ;1636 int ilv, prev_shift; 1541 1637 1542 1638 /* XXX: verify len field validity */ … … 1549 1645 } 1550 1646 /* XXX: only interleaved scan accepted */ 1551 if ((nb_components != s->nb_components) && !s->ls )1647 if ((nb_components != s->nb_components) && !s->ls && !s->progressive) 1552 1648 { 1553 1649 dprintf("decode_sos: components(%d) mismatch\n", nb_components); … … 1603 1699 predictor= get_bits(&s->gb, 8); /* JPEG Ss / lossless JPEG predictor /JPEG-LS NEAR */ 1604 1700 ilv= get_bits(&s->gb, 8); /* JPEG Se / JPEG-LS ILV */ 1605 skip_bits(&s->gb, 4); /* Ah */1701 prev_shift = get_bits(&s->gb, 4); /* Ah */ 1606 1702 point_transform= get_bits(&s->gb, 4); /* Al */ 1607 1703 … … 1649 1745 } 1650 1746 }else{ 1651 if(mjpeg_decode_scan(s ) < 0)1747 if(mjpeg_decode_scan(s, nb_components, predictor, ilv, prev_shift, point_transform) < 0) 1652 1748 return -1; 1653 1749 } … … 2038 2134 case SOF0: 2039 2135 s->lossless=0; 2136 s->progressive=0; 2137 if (mjpeg_decode_sof(s) < 0) 2138 return -1; 2139 break; 2140 case SOF2: 2141 s->lossless=0; 2142 s->progressive=1; 2040 2143 if (mjpeg_decode_sof(s) < 0) 2041 2144 return -1; … … 2043 2146 case SOF3: 2044 2147 s->lossless=1; 2148 s->progressive=0; 2045 2149 if (mjpeg_decode_sof(s) < 0) 2046 2150 return -1; … … 2049 2153 s->lossless=1; 2050 2154 s->ls=1; 2155 s->progressive=0; 2051 2156 if (mjpeg_decode_sof(s) < 0) 2052 2157 return -1; … … 2095 2200 break; 2096 2201 case SOF1: 2097 case SOF2:2098 2202 case SOF5: 2099 2203 case SOF6: -
TabularUnified trunk/libavcodec/mp3lameaudio.c ¶
r261 r263 136 136 } 137 137 138 int MP3lame_encode_frame(AVCodecContext *avctx,139 unsigned char *frame, int buf_size, void *data)138 static int MP3lame_encode_frame(AVCodecContext *avctx, 139 unsigned char *frame, int buf_size, void *data) 140 140 { 141 141 Mp3AudioContext *s = avctx->priv_data; … … 199 199 } 200 200 201 int MP3lame_encode_close(AVCodecContext *avctx)201 static int MP3lame_encode_close(AVCodecContext *avctx) 202 202 { 203 203 Mp3AudioContext *s = avctx->priv_data; -
TabularUnified trunk/libavcodec/mpeg12.c ¶
r262 r263 86 86 #endif 87 87 88 const enum PixelFormat pixfmt_yuv_420[]= {PIX_FMT_YUV420P,-1};89 const enum PixelFormat pixfmt_yuv_422[]= {PIX_FMT_YUV422P,-1};90 const enum PixelFormat pixfmt_yuv_444[]= {PIX_FMT_YUV444P,-1};91 const enum PixelFormat pixfmt_xvmc_mpg2_420[] = {88 static const enum PixelFormat pixfmt_yuv_420[]= {PIX_FMT_YUV420P,-1}; 89 static const enum PixelFormat pixfmt_yuv_422[]= {PIX_FMT_YUV422P,-1}; 90 static const enum PixelFormat pixfmt_yuv_444[]= {PIX_FMT_YUV444P,-1}; 91 static const enum PixelFormat pixfmt_xvmc_mpg2_420[] = { 92 92 PIX_FMT_XVMC_MPEG2_IDCT, 93 93 PIX_FMT_XVMC_MPEG2_MC, -
TabularUnified trunk/libavcodec/mpeg12data.h ¶
r256 r263 55 55 }; 56 56 57 const uint16_t vlc_dc_chroma_code[12] = {57 static const uint16_t vlc_dc_chroma_code[12] = { 58 58 0x0, 0x1, 0x2, 0x6, 0xe, 0x1e, 0x3e, 0x7e, 0xfe, 0x1fe, 0x3fe, 0x3ff, 59 59 }; 60 const unsigned char vlc_dc_chroma_bits[12] = {60 static const unsigned char vlc_dc_chroma_bits[12] = { 61 61 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 62 62 }; -
TabularUnified trunk/libavcodec/mpegaudio.h ¶
r261 r263 90 90 91 91 /* fast header check for resync */ 92 #if 1 93 static inline int ff_mpa_check_header(uint32_t header){ 94 if ((header & 0xffe00000) != 0xffe00000) 95 return -1; 96 if (!((header >> 17) & 3)) 97 return -1; 98 if (((header >> 12) & 0xf) == 0xf) 99 return -1; 100 if (((header >> 10) & 0x3) == 0x3) 101 return -1; 102 return 0; 103 } 104 #else 92 105 static inline int ff_mpa_check_header(uint32_t header){ 93 106 /* header */ … … 105 118 return 0; 106 119 } 120 #endif -
TabularUnified trunk/libavcodec/mpegaudiodec.c ¶
r261 r263 90 90 int adu_mode; ///< 0 for standard mp3, 1 for adu formatted mp3 91 91 int dither_state; 92 int error_resilience; 92 93 } MPADecodeContext; 93 94 … … 306 307 avctx->sample_fmt= SAMPLE_FMT_S16; 307 308 #endif 309 s->error_resilience= avctx->error_resilience; 308 310 309 311 if(avctx->antialias_algo != FF_AA_FLOAT) … … 1705 1707 s_index -= 4; 1706 1708 skip_bits_long(&s->gb, last_pos - pos); 1707 //av_log(NULL, AV_LOG_INFO, "overread, skip %d enddists: %d %d\n", last_pos - pos, end_pos-pos, end_pos2-pos); 1709 av_log(NULL, AV_LOG_INFO, "overread, skip %d enddists: %d %d\n", last_pos - pos, end_pos-pos, end_pos2-pos); 1710 if(s->error_resilience >= FF_ER_COMPLIANT) 1711 s_index=0; 1708 1712 break; 1709 1713 } … … 1743 1747 s_index+=4; 1744 1748 } 1745 memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*(576 - s_index));1746 1747 1749 /* skip extension bits */ 1748 1750 bits_left = end_pos - get_bits_count(&s->gb); 1749 1751 //av_log(NULL, AV_LOG_ERROR, "left:%d buf:%p\n", bits_left, s->in_gb.buffer); 1750 if (bits_left < 0) { 1751 dprintf("bits_left=%d\n", bits_left); 1752 return -1; 1753 } 1752 if (bits_left < 0 || bits_left > 16) { 1753 av_log(NULL, AV_LOG_ERROR, "bits_left=%d\n", bits_left); 1754 s_index=0; 1755 }else if(bits_left > 0 && s->error_resilience >= FF_ER_AGGRESSIVE){ 1756 av_log(NULL, AV_LOG_ERROR, "bits_left=%d\n", bits_left); 1757 s_index=0; 1758 } 1759 memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*(576 - s_index)); 1754 1760 skip_bits_long(&s->gb, bits_left); 1755 1761 … … 2167 2173 g->part2_3_length = get_bits(&s->gb, 12); 2168 2174 g->big_values = get_bits(&s->gb, 9); 2175 if(g->big_values > 288){ 2176 av_log(NULL, AV_LOG_ERROR, "big_values too big\n"); 2177 return -1; 2178 } 2179 2169 2180 g->global_gain = get_bits(&s->gb, 8); 2170 2181 /* if MS stereo only is selected, we precompute the … … 2180 2191 if (blocksplit_flag) { 2181 2192 g->block_type = get_bits(&s->gb, 2); 2182 if (g->block_type == 0) 2193 if (g->block_type == 0){ 2194 av_log(NULL, AV_LOG_ERROR, "invalid block type\n"); 2183 2195 return -1; 2196 } 2184 2197 g->switch_point = get_bits(&s->gb, 1); 2185 2198 for(i=0;i<2;i++) … … 2268 2281 dprintf("seekback: %d\n", main_data_begin); 2269 2282 //av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size); 2270 if(main_data_begin > s->last_buf_size){2271 //av_log(NULL, AV_LOG_ERROR, "backstep:%d, lastbuf:%d\n", main_data_begin, s->last_buf_size);2272 // s->last_buf_size= main_data_begin;2273 return -1;2274 }2275 2283 2276 2284 memcpy(s->last_buf + s->last_buf_size, ptr, EXTRABYTES); 2277 2285 s->in_gb= s->gb; 2278 init_get_bits(&s->gb, s->last_buf + s->last_buf_size - main_data_begin, main_data_begin*8); 2286 init_get_bits(&s->gb, s->last_buf, s->last_buf_size*8); 2287 skip_bits_long(&s->gb, 8*(s->last_buf_size - main_data_begin)); 2279 2288 } 2280 2289 … … 2282 2291 for(ch=0;ch<s->nb_channels;ch++) { 2283 2292 g = &granules[ch][gr]; 2293 if(get_bits_count(&s->gb)<0){ 2294 av_log(NULL, AV_LOG_ERROR, "mdb:%d, lastbuf:%d skiping granule %d\n", 2295 main_data_begin, s->last_buf_size, gr); 2296 skip_bits_long(&s->gb, g->part2_3_length); 2297 memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid)); 2298 if(get_bits_count(&s->gb) >= s->gb.size_in_bits && s->in_gb.buffer){ 2299 skip_bits_long(&s->in_gb, get_bits_count(&s->gb) - s->gb.size_in_bits); 2300 s->gb= s->in_gb; 2301 s->in_gb.buffer=NULL; 2302 } 2303 continue; 2304 } 2284 2305 2285 2306 bits_pos = get_bits_count(&s->gb); … … 2412 2433 2413 2434 /* read Huffman coded residue */ 2414 if (huffman_decode(s, g, exponents, 2415 bits_pos + g->part2_3_length) < 0) 2416 return -1; 2435 huffman_decode(s, g, exponents, bits_pos + g->part2_3_length); 2417 2436 #if defined(DEBUG) 2418 2437 sample_dump(0, g->sb_hybrid, 576); … … 2440 2459 } 2441 2460 } /* gr */ 2461 if(get_bits_count(&s->gb)<0) 2462 skip_bits_long(&s->gb, -get_bits_count(&s->gb)); 2442 2463 return nb_granules * 18; 2443 2464 } … … 2477 2498 av_log(NULL, AV_LOG_ERROR, "invalid old backstep %d\n", i); 2478 2499 s->gb= s->in_gb; 2500 s->in_gb.buffer= NULL; 2479 2501 } 2480 2502 … … 2484 2506 2485 2507 if(i<0 || i > BACKSTEP_SIZE || nb_frames<0){ 2486 //av_log(NULL, AV_LOG_ERROR, "invalid new backstep %d\n", i);2508 av_log(NULL, AV_LOG_ERROR, "invalid new backstep %d\n", i); 2487 2509 i= FFMIN(BACKSTEP_SIZE, buf_size - HEADER_SIZE); 2488 2510 } … … 2537 2559 if(ff_mpa_check_header(header) < 0){ 2538 2560 buf++; 2539 //buf_size--;2540 av_log(avctx, AV_LOG_ERROR, "Header missing skipping one byte. \n");2561 //buf_size--; 2562 av_log(avctx, AV_LOG_ERROR, "Header missing skipping one byte. 0x%08X\n", header); 2541 2563 goto retry; 2542 2564 } … … 2570 2592 return -1; 2571 2593 }else if(s->frame_size < buf_size){ 2572 av_log(avctx, AV_LOG_ERROR, "incorrect frame size \n");2594 av_log(avctx, AV_LOG_ERROR, "incorrect frame size. %i->%i\n", s->frame_size, buf_size); 2573 2595 } 2574 2596 … … 2582 2604 s->frame_size = 0; 2583 2605 return buf_size; 2606 } 2607 2608 static void flush(AVCodecContext *avctx){ 2609 MPADecodeContext *s = avctx->priv_data; 2610 s->last_buf_size= 0; 2584 2611 } 2585 2612 … … 2819 2846 decode_frame, 2820 2847 CODEC_CAP_PARSE_ONLY, 2848 .flush= flush, 2821 2849 }; 2822 2850 #endif … … 2833 2861 decode_frame_adu, 2834 2862 CODEC_CAP_PARSE_ONLY, 2863 .flush= flush, 2835 2864 }; 2836 2865 #endif … … 2846 2875 decode_close_mp3on4, 2847 2876 decode_frame_mp3on4, 2848 02877 .flush= flush, 2849 2878 }; 2850 2879 #endif -
TabularUnified trunk/libavcodec/mpegaudiodectab.h ¶
r256 r263 243 243 /* mpegaudio layer 3 huffman tables */ 244 244 245 const uint16_t mpa_huffcodes_1[4] = {245 static const uint16_t mpa_huffcodes_1[4] = { 246 246 0x0001, 0x0001, 0x0001, 0x0000, 247 247 }; 248 248 249 const uint8_t mpa_huffbits_1[4] = {249 static const uint8_t mpa_huffbits_1[4] = { 250 250 1, 3, 2, 3, 251 251 }; 252 252 253 const uint16_t mpa_huffcodes_2[9] = {253 static const uint16_t mpa_huffcodes_2[9] = { 254 254 0x0001, 0x0002, 0x0001, 0x0003, 0x0001, 0x0001, 0x0003, 0x0002, 255 255 0x0000, 256 256 }; 257 257 258 const uint8_t mpa_huffbits_2[9] = {258 static const uint8_t mpa_huffbits_2[9] = { 259 259 1, 3, 6, 3, 3, 5, 5, 5, 260 260 6, 261 261 }; 262 262 263 const uint16_t mpa_huffcodes_3[9] = {263 static const uint16_t mpa_huffcodes_3[9] = { 264 264 0x0003, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0003, 0x0002, 265 265 0x0000, 266 266 }; 267 267 268 const uint8_t mpa_huffbits_3[9] = {268 static const uint8_t mpa_huffbits_3[9] = { 269 269 2, 2, 6, 3, 2, 5, 5, 5, 270 270 6, 271 271 }; 272 272 273 const uint16_t mpa_huffcodes_5[16] = {273 static const uint16_t mpa_huffcodes_5[16] = { 274 274 0x0001, 0x0002, 0x0006, 0x0005, 0x0003, 0x0001, 0x0004, 0x0004, 275 275 0x0007, 0x0005, 0x0007, 0x0001, 0x0006, 0x0001, 0x0001, 0x0000, 276 276 }; 277 277 278 const uint8_t mpa_huffbits_5[16] = {278 static const uint8_t mpa_huffbits_5[16] = { 279 279 1, 3, 6, 7, 3, 3, 6, 7, 280 280 6, 6, 7, 8, 7, 6, 7, 8, 281 281 }; 282 282 283 const uint16_t mpa_huffcodes_6[16] = {283 static const uint16_t mpa_huffcodes_6[16] = { 284 284 0x0007, 0x0003, 0x0005, 0x0001, 0x0006, 0x0002, 0x0003, 0x0002, 285 285 0x0005, 0x0004, 0x0004, 0x0001, 0x0003, 0x0003, 0x0002, 0x0000, 286 286 }; 287 287 288 const uint8_t mpa_huffbits_6[16] = {288 static const uint8_t mpa_huffbits_6[16] = { 289 289 3, 3, 5, 7, 3, 2, 4, 5, 290 290 4, 4, 5, 6, 6, 5, 6, 7, 291 291 }; 292 292 293 const uint16_t mpa_huffcodes_7[36] = {293 static const uint16_t mpa_huffcodes_7[36] = { 294 294 0x0001, 0x0002, 0x000a, 0x0013, 0x0010, 0x000a, 0x0003, 0x0003, 295 295 0x0007, 0x000a, 0x0005, 0x0003, 0x000b, 0x0004, 0x000d, 0x0011, … … 299 299 }; 300 300 301 const uint8_t mpa_huffbits_7[36] = {301 static const uint8_t mpa_huffbits_7[36] = { 302 302 1, 3, 6, 8, 8, 9, 3, 4, 303 303 6, 7, 7, 8, 6, 5, 7, 8, … … 307 307 }; 308 308 309 const uint16_t mpa_huffcodes_8[36] = {309 static const uint16_t mpa_huffcodes_8[36] = { 310 310 0x0003, 0x0004, 0x0006, 0x0012, 0x000c, 0x0005, 0x0005, 0x0001, 311 311 0x0002, 0x0010, 0x0009, 0x0003, 0x0007, 0x0003, 0x0005, 0x000e, … … 315 315 }; 316 316 317 const uint8_t mpa_huffbits_8[36] = {317 static const uint8_t mpa_huffbits_8[36] = { 318 318 2, 3, 6, 8, 8, 9, 3, 2, 319 319 4, 8, 8, 8, 6, 4, 6, 8, … … 323 323 }; 324 324 325 const uint16_t mpa_huffcodes_9[36] = {325 static const uint16_t mpa_huffcodes_9[36] = { 326 326 0x0007, 0x0005, 0x0009, 0x000e, 0x000f, 0x0007, 0x0006, 0x0004, 327 327 0x0005, 0x0005, 0x0006, 0x0007, 0x0007, 0x0006, 0x0008, 0x0008, … … 331 331 }; 332 332 333 const uint8_t mpa_huffbits_9[36] = {333 static const uint8_t mpa_huffbits_9[36] = { 334 334 3, 3, 5, 6, 8, 9, 3, 3, 335 335 4, 5, 6, 8, 4, 4, 5, 6, … … 339 339 }; 340 340 341 const uint16_t mpa_huffcodes_10[64] = {341 static const uint16_t mpa_huffcodes_10[64] = { 342 342 0x0001, 0x0002, 0x000a, 0x0017, 0x0023, 0x001e, 0x000c, 0x0011, 343 343 0x0003, 0x0003, 0x0008, 0x000c, 0x0012, 0x0015, 0x000c, 0x0007, … … 350 350 }; 351 351 352 const uint8_t mpa_huffbits_10[64] = {352 static const uint8_t mpa_huffbits_10[64] = { 353 353 1, 3, 6, 8, 9, 9, 9, 10, 354 354 3, 4, 6, 7, 8, 9, 8, 8, … … 361 361 }; 362 362 363 const uint16_t mpa_huffcodes_11[64] = {363 static const uint16_t mpa_huffcodes_11[64] = { 364 364 0x0003, 0x0004, 0x000a, 0x0018, 0x0022, 0x0021, 0x0015, 0x000f, 365 365 0x0005, 0x0003, 0x0004, 0x000a, 0x0020, 0x0011, 0x000b, 0x000a, … … 372 372 }; 373 373 374 const uint8_t mpa_huffbits_11[64] = {374 static const uint8_t mpa_huffbits_11[64] = { 375 375 2, 3, 5, 7, 8, 9, 8, 9, 376 376 3, 3, 4, 6, 8, 8, 7, 8, … … 383 383 }; 384 384 385 const uint16_t mpa_huffcodes_12[64] = {385 static const uint16_t mpa_huffcodes_12[64] = { 386 386 0x0009, 0x0006, 0x0010, 0x0021, 0x0029, 0x0027, 0x0026, 0x001a, 387 387 0x0007, 0x0005, 0x0006, 0x0009, 0x0017, 0x0010, 0x001a, 0x000b, … … 394 394 }; 395 395 396 const uint8_t mpa_huffbits_12[64] = {396 static const uint8_t mpa_huffbits_12[64] = { 397 397 4, 3, 5, 7, 8, 9, 9, 9, 398 398 3, 3, 4, 5, 7, 7, 8, 8, … … 405 405 }; 406 406 407 const uint16_t mpa_huffcodes_13[256] = {407 static const uint16_t mpa_huffcodes_13[256] = { 408 408 0x0001, 0x0005, 0x000e, 0x0015, 0x0022, 0x0033, 0x002e, 0x0047, 409 409 0x002a, 0x0034, 0x0044, 0x0034, 0x0043, 0x002c, 0x002b, 0x0013, … … 440 440 }; 441 441 442 const uint8_t mpa_huffbits_13[256] = {442 static const uint8_t mpa_huffbits_13[256] = { 443 443 1, 4, 6, 7, 8, 9, 9, 10, 444 444 9, 10, 11, 11, 12, 12, 13, 13, … … 475 475 }; 476 476 477 const uint16_t mpa_huffcodes_15[256] = {477 static const uint16_t mpa_huffcodes_15[256] = { 478 478 0x0007, 0x000c, 0x0012, 0x0035, 0x002f, 0x004c, 0x007c, 0x006c, 479 479 0x0059, 0x007b, 0x006c, 0x0077, 0x006b, 0x0051, 0x007a, 0x003f, … … 510 510 }; 511 511 512 const uint8_t mpa_huffbits_15[256] = {512 static const uint8_t mpa_huffbits_15[256] = { 513 513 3, 4, 5, 7, 7, 8, 9, 9, 514 514 9, 10, 10, 11, 11, 11, 12, 13, … … 545 545 }; 546 546 547 const uint16_t mpa_huffcodes_16[256] = {547 static const uint16_t mpa_huffcodes_16[256] = { 548 548 0x0001, 0x0005, 0x000e, 0x002c, 0x004a, 0x003f, 0x006e, 0x005d, 549 549 0x00ac, 0x0095, 0x008a, 0x00f2, 0x00e1, 0x00c3, 0x0178, 0x0011, … … 580 580 }; 581 581 582 const uint8_t mpa_huffbits_16[256] = {582 static const uint8_t mpa_huffbits_16[256] = { 583 583 1, 4, 6, 8, 9, 9, 10, 10, 584 584 11, 11, 11, 12, 12, 12, 13, 9, … … 615 615 }; 616 616 617 const uint16_t mpa_huffcodes_24[256] = {617 static const uint16_t mpa_huffcodes_24[256] = { 618 618 0x000f, 0x000d, 0x002e, 0x0050, 0x0092, 0x0106, 0x00f8, 0x01b2, 619 619 0x01aa, 0x029d, 0x028d, 0x0289, 0x026d, 0x0205, 0x0408, 0x0058, … … 650 650 }; 651 651 652 const uint8_t mpa_huffbits_24[256] = {652 static const uint8_t mpa_huffbits_24[256] = { 653 653 4, 4, 6, 7, 8, 9, 9, 10, 654 654 10, 11, 11, 11, 11, 11, 12, 9, … … 685 685 }; 686 686 687 const HuffTable mpa_huff_tables[16] = {687 static const HuffTable mpa_huff_tables[16] = { 688 688 { 1, NULL, NULL }, 689 689 { 2, mpa_huffbits_1, mpa_huffcodes_1 }, … … 704 704 }; 705 705 706 const uint8_t mpa_huff_data[32][2] = {706 static const uint8_t mpa_huff_data[32][2] = { 707 707 { 0, 0 }, 708 708 { 1, 0 }, … … 752 752 753 753 /* band size tables */ 754 const uint8_t band_size_long[9][22] = {754 static const uint8_t band_size_long[9][22] = { 755 755 { 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, 756 756 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158, }, /* 44100 */ … … 773 773 }; 774 774 775 const uint8_t band_size_short[9][13] = {775 static const uint8_t band_size_short[9][13] = { 776 776 { 4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56, }, /* 44100 */ 777 777 { 4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66, }, /* 48000 */ … … 785 785 }; 786 786 787 const uint8_t mpa_pretab[2][22] = {787 static const uint8_t mpa_pretab[2][22] = { 788 788 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 789 789 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 }, … … 791 791 792 792 /* table for alias reduction (XXX: store it as integer !) */ 793 const float ci_table[8] = {793 static const float ci_table[8] = { 794 794 -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037, 795 795 }; -
TabularUnified trunk/libavcodec/mpegvideo.c ¶
r262 r263 1105 1105 } 1106 1106 1107 if(s->flags & CODEC_FLAG_LOW_DELAY){ 1108 if (s->codec_id != CODEC_ID_MPEG2VIDEO && s->codec_id != CODEC_ID_MPEG1VIDEO){ 1109 av_log(avctx, AV_LOG_ERROR, "low delay forcing is only available for mpeg1/2\n"); 1110 return -1; 1111 } 1112 if (s->max_b_frames != 0){ 1113 av_log(avctx, AV_LOG_ERROR, "b frames cannot be used with low delay\n"); 1114 return -1; 1115 } 1116 } 1117 1107 1118 if(s->avctx->thread_count > 1 && s->codec_id != CODEC_ID_MPEG4 1108 1119 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO … … 1170 1181 case CODEC_ID_MPEG1VIDEO: 1171 1182 s->out_format = FMT_MPEG1; 1172 s->low_delay= 0; //s->max_b_frames ? 0 : 1;1183 s->low_delay= !!(s->flags & CODEC_FLAG_LOW_DELAY); 1173 1184 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); 1174 1185 break; 1175 1186 case CODEC_ID_MPEG2VIDEO: 1176 1187 s->out_format = FMT_MPEG1; 1177 s->low_delay= 0; //s->max_b_frames ? 0 : 1;1188 s->low_delay= !!(s->flags & CODEC_FLAG_LOW_DELAY); 1178 1189 avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); 1179 1190 s->rtp_mode= 1; … … 1197 1208 s->low_delay=1; 1198 1209 break; 1210 #ifdef CONFIG_H261_ENCODER 1199 1211 case CODEC_ID_H261: 1212 if (ff_h261_get_picture_format(s->width, s->height) < 0) { 1213 av_log(avctx, AV_LOG_ERROR, "The specified picture size of %dx%d is not valid for the H.261 codec.\nValid sizes are 176x144, 352x288\n", s->width, s->height); 1214 return -1; 1215 } 1200 1216 s->out_format = FMT_H261; 1201 1217 avctx->delay=0; 1202 1218 s->low_delay=1; 1203 1219 break; 1220 #endif 1204 1221 case CODEC_ID_H263: 1205 1222 if (h263_get_picture_format(s->width, s->height) == 7) { … … 2538 2555 if(put_bits_count(&s->pb) > max_size && s->lambda < s->avctx->lmax){ 2539 2556 s->next_lambda= FFMAX(s->lambda+1, s->lambda*(s->qscale+1) / s->qscale); 2557 if(s->adaptive_quant){ 2558 int i; 2559 for(i=0; i<s->mb_height*s->mb_width; i++) 2560 s->lambda_table[i]= FFMAX(s->lambda_table[i]+1, s->lambda_table[i]*(s->qscale+1) / s->qscale); 2561 } 2540 2562 s->mb_skipped = 0; //done in MPV_frame_start() 2541 2563 if(s->pict_type==P_TYPE){ //done in encode_picture() so we must undo it … … 4752 4774 4753 4775 static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride){ 4754 uint32_t *sq = squareTbl + 256;4776 uint32_t *sq = ff_squareTbl + 256; 4755 4777 int acc=0; 4756 4778 int x,y; … … 5212 5234 if(best_s.mv_type==MV_TYPE_16X16 && !(best_s.mv_dir&MV_DIRECT)){ 5213 5235 const int last_qp= backup_s.qscale; 5214 int dquant, dir, qp, dc[6];5236 int qpi, qp, dc[6]; 5215 5237 DCTELEM ac[6][16]; 5216 5238 const int mvdir= (best_s.mv_dir&MV_DIR_BACKWARD) ? 1 : 0; 5239 static const int dquant_tab[4]={-1,1,-2,2}; 5217 5240 5218 5241 assert(backup_s.dquant == 0); … … 5227 5250 s->mv[1][0][1] = best_s.mv[1][0][1]; 5228 5251 5229 dir= s->pict_type == B_TYPE ? 2 : 1;5230 if(last_qp + dir > s->avctx->qmax) dir= -dir;5231 for(dquant= dir; dquant<=2 && dquant>=-2; dquant += dir){5252 qpi = s->pict_type == B_TYPE ? 2 : 0; 5253 for(; qpi<4; qpi++){ 5254 int dquant= dquant_tab[qpi]; 5232 5255 qp= last_qp + dquant; 5233 5256 if(qp < s->avctx->qmin || qp > s->avctx->qmax) 5234 break;5257 continue; 5235 5258 backup_s.dquant= dquant; 5236 5259 if(s->mb_intra && s->dc_val[0]){ … … 5250 5273 } 5251 5274 } 5252 if(dir > 0 && dquant==dir){5253 dquant= 0;5254 dir= -dir;5255 }else5256 break;5257 5275 } 5258 5276 } -
TabularUnified trunk/libavcodec/mpegvideo.h ¶
r262 r263 825 825 void ff_h261_encode_picture_header(MpegEncContext * s, int picture_number); 826 826 void ff_h261_encode_init(MpegEncContext *s); 827 int ff_h261_get_picture_format(int width, int height); 827 828 828 829 -
TabularUnified trunk/libavcodec/msmpeg4.c ¶
r261 r263 676 676 "movl %%edx, %2 \n\t" 677 677 : "+b" (a), "+c" (b), "+D" (c) 678 : "g" (scale), "S" ( inverse[scale])678 : "g" (scale), "S" (ff_inverse[scale]) 679 679 : "%eax", "%edx" 680 680 ); -
TabularUnified trunk/libavcodec/os2thread.c ¶
r256 r263 25 25 #include "avcodec.h" 26 26 #include "common.h" 27 28 #ifdef HAVE_THREADS29 27 30 28 #define INCL_DOS … … 148 146 return -1; 149 147 } 150 #endif -
TabularUnified trunk/libavcodec/os_support.h ¶
r147 r263 27 27 #include <stdlib.h> 28 28 static inline int usleep(unsigned int t) { return _sleep2(t / 1000); } 29 static inline int strcasecmp(const char* s1, const char* s2) { return stricmp(s1,s2); }29 //static inline int strcasecmp(const char* s1, const char* s2) { return stricmp(s1,s2); } 30 30 #endif 31 31 -
TabularUnified trunk/libavcodec/parser.c ¶
r262 r263 362 362 #endif 363 363 364 #ifdef CONFIG_CAVSVIDEO_PARSER 365 static int cavsvideo_parse(AVCodecParserContext *s, 366 AVCodecContext *avctx, 367 uint8_t **poutbuf, int *poutbuf_size, 368 const uint8_t *buf, int buf_size) 369 { 370 ParseContext *pc = s->priv_data; 371 int next; 372 373 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){ 374 next= buf_size; 375 }else{ 376 next= ff_cavs_find_frame_end(pc, buf, buf_size); 377 378 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) { 379 *poutbuf = NULL; 380 *poutbuf_size = 0; 381 return buf_size; 382 } 383 } 384 *poutbuf = (uint8_t *)buf; 385 *poutbuf_size = buf_size; 386 return next; 387 } 388 #endif /* CONFIG_CAVSVIDEO_PARSER */ 389 390 static int mpeg4video_split(AVCodecContext *avctx, 364 int ff_mpeg4video_split(AVCodecContext *avctx, 391 365 const uint8_t *buf, int buf_size) 392 366 { … … 855 829 mpeg4video_parse, 856 830 ff_parse1_close, 857 mpeg4video_split, 858 }; 859 #endif 860 #ifdef CONFIG_CAVSVIDEO_PARSER 861 AVCodecParser cavsvideo_parser = { 862 { CODEC_ID_CAVS }, 863 sizeof(ParseContext1), 864 NULL, 865 cavsvideo_parse, 866 ff_parse1_close, 867 mpeg4video_split, 831 ff_mpeg4video_split, 868 832 }; 869 833 #endif -
TabularUnified trunk/libavcodec/raw.c ¶
r262 r263 38 38 } PixelFormatTag; 39 39 40 const PixelFormatTag pixelFormatTags[] = {40 static const PixelFormatTag pixelFormatTags[] = { 41 41 { PIX_FMT_YUV420P, MKTAG('I', '4', '2', '0') }, /* Planar formats */ 42 42 { PIX_FMT_YUV420P, MKTAG('I', 'Y', 'U', 'V') }, -
TabularUnified trunk/libavcodec/simple_idct.c ¶
r256 r263 185 185 { 186 186 int a0, a1, a2, a3, b0, b1, b2, b3; 187 uint8_t *cm = cropTbl + MAX_NEG_CROP;187 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 188 188 189 189 /* XXX: I did that only to give same values as previous code */ … … 257 257 { 258 258 int a0, a1, a2, a3, b0, b1, b2, b3; 259 uint8_t *cm = cropTbl + MAX_NEG_CROP;259 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 260 260 261 261 /* XXX: I did that only to give same values as previous code */ … … 432 432 { 433 433 int c0, c1, c2, c3, a0, a1, a2, a3; 434 const uint8_t *cm = cropTbl + MAX_NEG_CROP;434 const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 435 435 436 436 a0 = col[8*0]; … … 512 512 { 513 513 int c0, c1, c2, c3, a0, a1, a2, a3; 514 const uint8_t *cm = cropTbl + MAX_NEG_CROP;514 const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 515 515 516 516 a0 = col[8*0]; … … 540 540 { 541 541 int c0, c1, c2, c3, a0, a1, a2, a3; 542 //const uint8_t *cm = cropTbl + MAX_NEG_CROP;542 //const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 543 543 544 544 a0 = row[0]; -
TabularUnified trunk/libavcodec/snow.c ¶
r261 r263 1903 1903 { 1904 1904 int s, i, j; 1905 uint32_t *sq = squareTbl + 256;1905 uint32_t *sq = ff_squareTbl + 256; 1906 1906 1907 1907 s = 0; -
TabularUnified trunk/libavcodec/svq3.c ¶
r256 r263 148 148 const int qmul= svq3_dequant_coeff[qp]; 149 149 int i; 150 uint8_t *cm = cropTbl + MAX_NEG_CROP;150 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 151 151 152 152 if (dc) { -
TabularUnified trunk/libavcodec/utils.c ¶
r262 r263 442 442 {"naq", "normalize adaptive quantization", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_NORMALIZE_AQP, INT_MIN, INT_MAX, V|E, "flags"}, 443 443 {"ildct", "use interlaced dct", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_INTERLACED_DCT, INT_MIN, INT_MAX, V|E, "flags"}, 444 {"low_delay", "force low delay", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_LOW_DELAY, INT_MIN, INT_MAX, V|D , "flags"},444 {"low_delay", "force low delay", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_LOW_DELAY, INT_MIN, INT_MAX, V|D|E, "flags"}, 445 445 {"alt", "enable alternate scantable (mpeg2/mpeg4)", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_ALT_SCAN, INT_MIN, INT_MAX, V|E, "flags"}, 446 446 {"trell", "use trellis quantization", 0, FF_OPT_TYPE_CONST, CODEC_FLAG_TRELLIS_QUANT, INT_MIN, INT_MAX, V|E, "flags"}, -
TabularUnified trunk/libavcodec/vc1.c ¶
r257 r263 3341 3341 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2)); 3342 3342 if(v->pq >= 9 && v->overlap) { 3343 if(v->c_avail) 3344 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1)); 3343 3345 if(v->a_avail) 3344 3346 s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? ((i&1)>>1) : (s->mb_y&1)); 3345 if(v->c_avail)3346 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1));3347 3347 } 3348 3348 } else if(val) { … … 3444 3444 s->dsp.put_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize); 3445 3445 if(v->pq >= 9 && v->overlap) { 3446 if(v->c_avail) 3447 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1)); 3446 3448 if(v->a_avail) 3447 3449 s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? ((i&1)>>1) : (s->mb_y&1)); 3448 if(v->c_avail)3449 s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2), (i<4) ? (i&1) : (s->mb_x&1));3450 3450 } 3451 3451 } else if(is_coded[i]) { … … 3713 3713 vc1_put_block(v, s->block); 3714 3714 if(v->pq >= 9 && v->overlap) { 3715 if(s->mb_x) { 3716 s->dsp.vc1_h_overlap(s->dest[0], s->linesize, 0); 3717 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 0); 3718 if(!(s->flags & CODEC_FLAG_GRAY)) { 3719 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize, s->mb_x&1); 3720 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize, s->mb_x&1); 3721 } 3722 } 3723 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize, 1); 3724 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); 3715 3725 if(!s->first_slice_line) { 3716 3726 s->dsp.vc1_v_overlap(s->dest[0], s->linesize, 0); … … 3723 3733 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 1); 3724 3734 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); 3725 if(s->mb_x) {3726 s->dsp.vc1_h_overlap(s->dest[0], s->linesize, 0);3727 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 0);3728 if(!(s->flags & CODEC_FLAG_GRAY)) {3729 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize, s->mb_x&1);3730 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize, s->mb_x&1);3731 }3732 }3733 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize, 1);3734 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1);3735 3735 } 3736 3736 … … 3843 3843 vc1_put_block(v, s->block); 3844 3844 if(overlap) { 3845 if(s->mb_x) { 3846 s->dsp.vc1_h_overlap(s->dest[0], s->linesize, 0); 3847 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 0); 3848 if(!(s->flags & CODEC_FLAG_GRAY)) { 3849 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize, s->mb_x&1); 3850 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize, s->mb_x&1); 3851 } 3852 } 3853 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize, 1); 3854 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); 3845 3855 if(!s->first_slice_line) { 3846 3856 s->dsp.vc1_v_overlap(s->dest[0], s->linesize, 0); … … 3853 3863 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 1); 3854 3864 s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1); 3855 if(s->mb_x) {3856 s->dsp.vc1_h_overlap(s->dest[0], s->linesize, 0);3857 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize, 0);3858 if(!(s->flags & CODEC_FLAG_GRAY)) {3859 s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize, s->mb_x&1);3860 s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize, s->mb_x&1);3861 }3862 }3863 s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize, 1);3864 s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize, 1);3865 3865 } 3866 3866 -
TabularUnified trunk/libavcodec/vc1data.h ¶
r256 r263 48 48 49 49 /* pre-computed scales for all bfractions and base=256 */ 50 const int16_t vc1_bfraction_lut[23] = {50 static const int16_t vc1_bfraction_lut[23] = { 51 51 128 /*1/2*/, 85 /*1/3*/, 170 /*2/3*/, 64 /*1/4*/, 52 52 192 /*3/4*/, 51 /*1/5*/, 102 /*2/5*/, … … 59 59 #endif 60 60 61 const uint8_t vc1_bfraction_bits[23] = {61 static const uint8_t vc1_bfraction_bits[23] = { 62 62 3, 3, 3, 3, 63 63 3, 3, 3, … … 68 68 7, 7 69 69 }; 70 const uint8_t vc1_bfraction_codes[23] = {70 static const uint8_t vc1_bfraction_codes[23] = { 71 71 0, 1, 2, 3, 72 72 4, 5, 6, -
TabularUnified trunk/libavcodec/vc1dsp.c ¶
r256 r263 30 30 31 31 32 /** Apply overlap transform to vertical edge32 /** Apply overlap transform to horizontal edge 33 33 */ 34 34 static void vc1_v_overlap_c(uint8_t* src, int stride, int rnd) … … 36 36 int i; 37 37 int a, b, c, d; 38 int d1, d2; 38 39 for(i = 0; i < 8; i++) { 39 40 a = src[-2*stride]; … … 41 42 c = src[0]; 42 43 d = src[stride]; 43 44 src[-2*stride] = clip_uint8((7*a + d + 4 - rnd) >> 3); 45 src[-stride] = clip_uint8((-a + 7*b + c + d + 3 + rnd) >> 3); 46 src[0] = clip_uint8((a + b + 7*c - d + 4 - rnd) >> 3); 47 src[stride] = clip_uint8((a + 7*d + 3 + rnd) >> 3); 44 d1 = (a - d + 3 + rnd) >> 3; 45 d2 = (a - d + b - c + 4 - rnd) >> 3; 46 47 src[-2*stride] = a - d1; 48 src[-stride] = b - d2; 49 src[0] = c + d2; 50 src[stride] = d + d1; 48 51 src++; 49 52 } 50 53 } 51 54 52 /** Apply overlap transform to horizontal edge55 /** Apply overlap transform to vertical edge 53 56 */ 54 57 static void vc1_h_overlap_c(uint8_t* src, int stride, int rnd) … … 56 59 int i; 57 60 int a, b, c, d; 61 int d1, d2; 58 62 for(i = 0; i < 8; i++) { 59 63 a = src[-2]; … … 61 65 c = src[0]; 62 66 d = src[1]; 63 64 src[-2] = clip_uint8((7*a + d + 4 - rnd) >> 3); 65 src[-1] = clip_uint8((-a + 7*b + c + d + 3 + rnd) >> 3); 66 src[0] = clip_uint8((a + b + 7*c - d + 4 - rnd) >> 3); 67 src[1] = clip_uint8((a + 7*d + 3 + rnd) >> 3); 67 d1 = (a - d + 3 + rnd) >> 3; 68 d2 = (a - d + b - c + 4 - rnd) >> 3; 69 70 src[-2] = a - d1; 71 src[-1] = b - d2; 72 src[0] = c + d2; 73 src[1] = d + d1; 68 74 src += stride; 69 75 } -
TabularUnified trunk/libavcodec/vmdav.c ¶
r256 r263 485 485 if (s->bits == 16) 486 486 vmdaudio_decode_audio(s, data, buf, 1); 487 else 487 else { 488 488 /* copy the data but convert it to signed */ 489 for (i = 0; i < s->block_align; i++) 490 data[i * 2 + 1] = buf[i] + 0x80; 489 for (i = 0; i < s->block_align; i++){ 490 *data++ = buf[i] + 0x80; 491 *data++ = buf[i] + 0x80; 492 } 493 } 491 494 } 492 495 } else { … … 501 504 } else { 502 505 /* copy the data but convert it to signed */ 503 for (i = 0; i < s->block_align; i++) 504 data[i * 2 + 1] = buf[i] + 0x80; 506 for (i = 0; i < s->block_align; i++){ 507 *data++ = buf[i] + 0x80; 508 *data++ = buf[i] + 0x80; 509 } 505 510 } 506 511 } … … 515 520 { 516 521 VmdAudioContext *s = (VmdAudioContext *)avctx->priv_data; 517 unsigned int sound_flags;518 522 unsigned char *output_samples = (unsigned char *)data; 519 523 520 524 /* point to the start of the encoded data */ 521 525 unsigned char *p = buf + 16; 522 unsigned char *p_end = buf + buf_size;523 526 524 527 if (buf_size < 16) … … 529 532 *data_size = vmdaudio_loadsound(s, output_samples, p, 0); 530 533 } else if (buf[6] == 2) { 531 /* the chunk contains audio and silence mixed together */ 532 sound_flags = LE_32(p); 534 /* the chunk may contain audio */ 533 535 p += 4; 534 535 /* do something with extrabufs here? */ 536 537 while (p < p_end) { 538 if (sound_flags & 0x01) 539 /* silence */ 540 *data_size += vmdaudio_loadsound(s, output_samples, p, 1); 541 else { 542 /* audio */ 543 *data_size += vmdaudio_loadsound(s, output_samples, p, 0); 544 p += s->block_align; 545 } 546 output_samples += (s->block_align * s->bits / 8); 547 sound_flags >>= 1; 548 } 536 *data_size = vmdaudio_loadsound(s, output_samples, p, (buf_size == 16)); 537 output_samples += (s->block_align * s->bits / 8); 549 538 } else if (buf[6] == 3) { 550 539 /* silent chunk */ -
TabularUnified trunk/libavcodec/vorbis.c ¶
r257 r263 1439 1439 for(partition_count=0;partition_count<ptns_to_read;) { // SPEC error 1440 1440 if (!pass) { 1441 uint_fast32_t inverse_class = inverse[vr->classifications];1441 uint_fast32_t inverse_class = ff_inverse[vr->classifications]; 1442 1442 for(j_times_ptns_to_read=0, j=0;j<ch_used;++j) { 1443 1443 if (!do_not_decode[j]) { -
TabularUnified trunk/libavcodec/vp3dsp.c ¶
r256 r263 43 43 { 44 44 int16_t *ip = input; 45 uint8_t *cm = cropTbl + MAX_NEG_CROP;45 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 46 46 47 47 int A, B, C, D, Ad, Bd, Cd, Dd, E, F, G, H; -
TabularUnified trunk/libavcodec/vp6data.h ¶
r261 r263 276 276 }; 277 277 278 const vp56_tree_t vp6_pcr_tree[] = {278 static const vp56_tree_t vp6_pcr_tree[] = { 279 279 { 8, 0}, 280 280 { 4, 1}, -
TabularUnified trunk/libavcodec/x264.c ¶
r261 r263 67 67 } 68 68 69 externint69 static int 70 70 X264_frame(AVCodecContext *ctx, uint8_t *buf, int bufsize, void *data) 71 71 { … … 131 131 } 132 132 133 externint133 static int 134 134 X264_init(AVCodecContext *avctx) 135 135 { -
TabularUnified trunk/libavcodec/xl.c ¶
r256 r263 34 34 } VideoXLContext; 35 35 36 const int xl_table[32] = {36 static const int xl_table[32] = { 37 37 0, 1, 2, 3, 4, 5, 6, 7, 38 38 8, 9, 12, 15, 20, 25, 34, 46, -
TabularUnified trunk/libavformat/aiff.c ¶
r261 r263 24 24 #include "intfloat_readwrite.h" 25 25 26 const CodecTag codec_aiff_tags[] = {26 static const CodecTag codec_aiff_tags[] = { 27 27 { CODEC_ID_PCM_S16BE, MKTAG('N','O','N','E') }, 28 28 { CODEC_ID_PCM_S8, MKTAG('N','O','N','E') }, -
TabularUnified trunk/libavformat/allformats.c ¶
r261 r263 250 250 #endif 251 251 #ifdef CONFIG_NUT_MUXER 252 #ifdef CONFIG_LIBNUT 252 253 av_register_output_format(&nut_muxer); 254 #endif 253 255 #endif 254 256 #ifdef CONFIG_NUV_DEMUXER -
TabularUnified trunk/libavformat/asf.c ¶
r261 r263 23 23 #include "mpegaudio.h" 24 24 #include "asf.h" 25 #include "common.h" 25 26 26 27 #undef NDEBUG … … 108 109 static void get_str16_nolen(ByteIOContext *pb, int len, char *buf, int buf_size) 109 110 { 110 int c; 111 char *q; 112 113 q = buf; 114 while (len > 0) { 115 c = get_le16(pb); 116 if ((q - buf) < buf_size - 1) 117 *q++ = c; 118 len-=2; 111 char* q = buf; 112 len /= 2; 113 while (len--) { 114 uint8_t tmp; 115 PUT_UTF8(get_le16(pb), tmp, if (q - buf < buf_size - 1) *q++ = tmp;) 119 116 } 120 117 *q = '\0'; … … 362 359 363 360 name_len = get_le16(pb); 364 name = (char *)av_malloc z(name_len);365 get_str16_nolen(pb, name_len, name, name_len );361 name = (char *)av_malloc(name_len * 2); 362 get_str16_nolen(pb, name_len, name, name_len * 2); 366 363 value_type = get_le16(pb); 367 364 value_len = get_le16(pb); 368 365 if ((value_type == 0) || (value_type == 1)) // unicode or byte 369 366 { 370 value = (char *)av_mallocz(value_len); 371 get_str16_nolen(pb, value_len, value, value_len); 367 value = (char *)av_malloc(value_len * 2); 368 get_str16_nolen(pb, value_len, value, 369 value_len * 2); 372 370 if (strcmp(name,"WM/AlbumTitle")==0) { pstrcpy(s->album, sizeof(s->album), value); } 373 371 av_free(value); -
TabularUnified trunk/libavformat/avformat.h ¶
r262 r263 32 32 #define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) 33 33 34 #include "config.h" 34 35 #include <time.h> 35 36 #include <stdio.h> /* FILE */ 36 37 #include "avcodec.h" 37 #include "config.h"38 38 39 39 #include "avio.h" … … 238 238 /** 239 239 * real base frame rate of the stream. 240 * this is the lowest framerate with which all timestamps can be 241 * represented accurately (its the least common multiple of all 242 * framerates in the stream), Note, this value is just a guess! 240 243 * for example if the timebase is 1/90000 and all frames have either 241 244 * approximately 3600 or 1800 timer ticks then r_frame_rate will be 50/1 … … 444 447 int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags); 445 448 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp); 449 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, int64_t pos_min, int64_t pos_max, int64_t pos_limit, int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret, int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )); 446 450 447 451 /* media file output */ -
TabularUnified trunk/libavformat/avidec.c ¶
r262 r263 146 146 avi->non_interleaved= 1; 147 147 else 148 av_add_index_entry(st, pos, ast->cum_len , len, 0, key ? AVINDEX_KEYFRAME : 0);148 av_add_index_entry(st, pos, ast->cum_len / FFMAX(1, ast->sample_size), len, 0, key ? AVINDEX_KEYFRAME : 0); 149 149 150 150 if(ast->sample_size) 151 ast->cum_len += len / ast->sample_size;151 ast->cum_len += len; 152 152 else 153 153 ast->cum_len ++; … … 217 217 AVStream *st; 218 218 AVIStream *ast = NULL; 219 int xan_video = 0; /* hack to support Xan A/V */220 219 char str_track[4]; 221 220 … … 307 306 av_freep(&s->streams[0]); 308 307 s->nb_streams = 0; 309 avi->dv_demux = dv_init_demux(s); 310 if (!avi->dv_demux) 311 goto fail; 308 if (ENABLE_DV_DEMUXER) { 309 avi->dv_demux = dv_init_demux(s); 310 if (!avi->dv_demux) 311 goto fail; 312 } 312 313 s->streams[0]->priv_data = ast; 313 314 url_fskip(pb, 3 * 4); … … 354 355 get_le32(pb); /* quality */ 355 356 ast->sample_size = get_le32(pb); /* sample ssize */ 357 ast->cum_len *= FFMAX(1, ast->sample_size); 356 358 // av_log(NULL, AV_LOG_DEBUG, "%d %d %d %d\n", ast->rate, ast->scale, ast->start, ast->sample_size); 357 359 … … 377 379 goto fail; 378 380 } 379 ast->frame_offset= ast->cum_len * FFMAX(ast->sample_size, 1);381 ast->frame_offset= ast->cum_len; 380 382 url_fskip(pb, size - 12 * 4); 381 383 break; … … 430 432 st->codec->codec_tag = tag1; 431 433 st->codec->codec_id = codec_get_id(codec_bmp_tags, tag1); 432 if (st->codec->codec_id == CODEC_ID_XAN_WC4)433 xan_video = 1;434 434 st->need_parsing = 2; //only parse headers dont do slower repacketization, this is needed to get the pict type which is needed for generating correct pts 435 435 // url_fskip(pb, size - 5 * 4); … … 441 441 if (size%2) /* 2-aligned (fix for Stargate SG-1 - 3x18 - Shades of Grey.avi) */ 442 442 url_fskip(pb, 1); 443 /* special case time: To support Xan DPCM, hardcode444 * the format if Xxan is the video codec*/443 /* Force parsing as several audio frames can be in 444 * one packet. */ 445 445 st->need_parsing = 1; 446 446 /* ADTS header is in extradata, AAC without header must be stored as exact frames, parser not needed and it will fail */ 447 447 if (st->codec->codec_id == CODEC_ID_AAC && st->codec->extradata_size) 448 448 st->need_parsing = 0; 449 /* force parsing as several audio frames can be in 450 one packet */ 451 if (xan_video) 452 st->codec->codec_id = CODEC_ID_XAN_DPCM; 449 /* AVI files with Xan DPCM audio (wrongly) declare PCM 450 * audio in the header but have Axan as stream_code_tag. */ 451 if (st->codec->stream_codec_tag == ff_get_fourcc("Axan")){ 452 st->codec->codec_id = CODEC_ID_XAN_DPCM; 453 st->codec->codec_tag = 0; 454 } 453 455 break; 454 456 default: … … 526 528 void* dstr; 527 529 528 if ( avi->dv_demux) {530 if (ENABLE_DV_DEMUXER && avi->dv_demux) { 529 531 size = dv_get_packet(avi->dv_demux, pkt); 530 532 if (size >= 0) … … 595 597 av_get_packet(pb, pkt, size); 596 598 597 if ( avi->dv_demux) {599 if (ENABLE_DV_DEMUXER && avi->dv_demux) { 598 600 dstr = pkt->destruct; 599 601 size = dv_produce_packet(avi->dv_demux, pkt, … … 804 806 avi->non_interleaved= 1; 805 807 else 806 av_add_index_entry(st, pos, ast->cum_len , len, 0, (flags&AVIIF_INDEX) ? AVINDEX_KEYFRAME : 0);808 av_add_index_entry(st, pos, ast->cum_len / FFMAX(1, ast->sample_size), len, 0, (flags&AVIIF_INDEX) ? AVINDEX_KEYFRAME : 0); 807 809 if(ast->sample_size) 808 ast->cum_len += len / ast->sample_size;810 ast->cum_len += len; 809 811 else 810 812 ast->cum_len ++; … … 936 938 } 937 939 938 if ( avi->dv_demux)940 if (ENABLE_DV_DEMUXER && avi->dv_demux) 939 941 dv_flush_audio_packets(avi->dv_demux); 940 942 /* do the seek */ -
TabularUnified trunk/libavformat/config.h ¶
r262 r263 1 2 #ifndef ARCH_X86 1 3 #define ARCH_X86 4 #endif 5 6 #ifndef HAVE_MMX 2 7 #define HAVE_MMX 8 #endif 3 9 #define CONFIG_ENCODERS 4 10 #define CONFIG_DECODERS … … 9 15 #define CONFIG_MUXERS 10 16 #define CONFIG_DEMUXERS 11 #define CONFIG_FOURXM_DEMUXER 12 #define CONFIG_ADTS_MUXER 13 #define CONFIG_AIFF_DEMUXER 14 #define CONFIG_AIFF_MUXER 15 #define CONFIG_AMR_DEMUXER 16 #define CONFIG_AMR_MUXER 17 #define CONFIG_ASF_DEMUXER 18 #define CONFIG_ASF_MUXER 19 #define CONFIG_ASF_STREAM_MUXER 20 #define CONFIG_AU_DEMUXER 21 #define CONFIG_AU_MUXER 17 #define CONFIG_MPEGAUDIO_PARSER 18 //#define CONFIG_FOURXM_DEMUXER 19 //#define CONFIG_ADTS_MUXER 20 //#define CONFIG_AIFF_DEMUXER 21 //#define CONFIG_AIFF_MUXER 22 //#define CONFIG_AMR_DEMUXER 23 //#define CONFIG_AMR_MUXER 24 //#define CONFIG_ASF_DEMUXER 25 //#define CONFIG_ASF_MUXER 26 //#define CONFIG_ASF_STREAM_MUXER 27 //#define CONFIG_AU_DEMUXER 28 //#define CONFIG_AU_MUXER 22 29 #define CONFIG_AVI_DEMUXER 23 30 #define CONFIG_AVI_MUXER 24 #define CONFIG_CRC_MUXER 25 #define CONFIG_FRAMECRC_MUXER 26 #define CONFIG_DAUD_DEMUXER 27 #define CONFIG_DV_DEMUXER 28 #define CONFIG_DV_MUXER 29 #define CONFIG_EA_DEMUXER 30 #define CONFIG_FFM_DEMUXER 31 #define CONFIG_FFM_MUXER 32 #define CONFIG_FLIC_DEMUXER 31 #define ENABLE_DV_DEMUXER 0 32 //#define CONFIG_CRC_MUXER 33 //#define CONFIG_FRAMECRC_MUXER 34 //#define CONFIG_DAUD_DEMUXER 35 //#define CONFIG_DV_DEMUXER 36 //#define CONFIG_DV_MUXER 37 //#define CONFIG_EA_DEMUXER 38 //#define CONFIG_FFM_DEMUXER 39 //#define CONFIG_FFM_MUXER 40 //#define CONFIG_FLIC_DEMUXER 33 41 #define CONFIG_FLV_DEMUXER 34 42 #define CONFIG_FLV_MUXER 35 #define CONFIG_GIF_MUXER36 #define CONFIG_GIF_DEMUXER37 #define CONFIG_IDCIN_DEMUXER38 #define CONFIG_ROQ_DEMUXER39 #define CONFIG_IMAGE2_DEMUXER40 #define CONFIG_IMAGE2PIPE_DEMUXER41 #define CONFIG_IMAGE2_MUXER42 #define CONFIG_IMAGE_DEMUXER43 #define CONFIG_IMAGE_MUXER44 #define CONFIG_IPMOVIE_DEMUXER43 //#define CONFIG_GIF_MUXER 44 //#define CONFIG_GIF_DEMUXER 45 //#define CONFIG_IDCIN_DEMUXER 46 //#define CONFIG_ROQ_DEMUXER 47 //#define CONFIG_IMAGE2_DEMUXER 48 //#define CONFIG_IMAGE2PIPE_DEMUXER 49 //#define CONFIG_IMAGE2_MUXER 50 //#define CONFIG_IMAGE_DEMUXER 51 //#define CONFIG_IMAGE_MUXER 52 //#define CONFIG_IPMOVIE_DEMUXER 45 53 #define CONFIG_MATROSKA_DEMUXER 46 #define CONFIG_MM_DEMUXER54 //#define CONFIG_MM_DEMUXER 47 55 #define CONFIG_MMF_DEMUXER 48 #define CONFIG_MMF_MUXER49 #define CONFIG_MOV_DEMUXER50 #define CONFIG_MOV_MUXER51 #define CONFIG_TGP_MUXER52 #define CONFIG_MP4_MUXER53 #define CONFIG_PSP_MUXER54 #define CONFIG_TG2_MUXER55 #define CONFIG_MP3_DEMUXER56 #define CONFIG_MP2_MUXER57 #define CONFIG_MP3_MUXER58 #define CONFIG_MPEG1SYSTEM_MUXER59 #define CONFIG_MPEG1VCD_MUXER60 #define CONFIG_MPEG2VOB_MUXER61 #define CONFIG_MPEG2SVCD_MUXER62 #define CONFIG_MPEG2DVD_MUXER56 //#define CONFIG_MMF_MUXER 57 //#define CONFIG_MOV_DEMUXER 58 //#define CONFIG_MOV_MUXER 59 //#define CONFIG_TGP_MUXER 60 //#define CONFIG_MP4_MUXER 61 //#define CONFIG_PSP_MUXER 62 //#define CONFIG_TG2_MUXER 63 //#define CONFIG_MP3_DEMUXER 64 //#define CONFIG_MP2_MUXER 65 //#define CONFIG_MP3_MUXER 66 //#define CONFIG_MPEG1SYSTEM_MUXER 67 //#define CONFIG_MPEG1VCD_MUXER 68 //#define CONFIG_MPEG2VOB_MUXER 69 //#define CONFIG_MPEG2SVCD_MUXER 70 //#define CONFIG_MPEG2DVD_MUXER 63 71 #define CONFIG_MPEGPS_DEMUXER 64 72 #define CONFIG_MPEGTS_DEMUXER 65 #define CONFIG_MPEGTS_MUXER66 #define CONFIG_MPJPEG_MUXER67 #define CONFIG_NSV_DEMUXER68 #define CONFIG_NUT_DEMUXER69 #define CONFIG_NUT_MUXER70 #define CONFIG_NUV_DEMUXER71 #define CONFIG_OGG_DEMUXER72 #define CONFIG_OGG_MUXER73 #define CONFIG_STR_DEMUXER74 #define CONFIG_SHORTEN_DEMUXER75 #define CONFIG_FLAC_DEMUXER76 #define CONFIG_FLAC_MUXER77 #define CONFIG_AC3_DEMUXER78 #define CONFIG_AC3_MUXER79 #define CONFIG_DTS_DEMUXER80 #define CONFIG_AAC_DEMUXER81 #define CONFIG_H261_DEMUXER82 #define CONFIG_H261_MUXER83 #define CONFIG_H263_DEMUXER84 #define CONFIG_H263_MUXER85 #define CONFIG_M4V_DEMUXER86 #define CONFIG_M4V_MUXER87 #define CONFIG_H264_DEMUXER88 #define CONFIG_H264_MUXER73 //#define CONFIG_MPEGTS_MUXER 74 //#define CONFIG_MPJPEG_MUXER 75 //#define CONFIG_NSV_DEMUXER 76 //#define CONFIG_NUT_DEMUXER 77 //#define CONFIG_NUT_MUXER 78 //#define CONFIG_NUV_DEMUXER 79 //#define CONFIG_OGG_DEMUXER 80 //#define CONFIG_OGG_MUXER 81 //#define CONFIG_STR_DEMUXER 82 //#define CONFIG_SHORTEN_DEMUXER 83 //#define CONFIG_FLAC_DEMUXER 84 //#define CONFIG_FLAC_MUXER 85 //#define CONFIG_AC3_DEMUXER 86 //#define CONFIG_AC3_MUXER 87 //#define CONFIG_DTS_DEMUXER 88 //#define CONFIG_AAC_DEMUXER 89 //#define CONFIG_H261_DEMUXER 90 //#define CONFIG_H261_MUXER 91 //#define CONFIG_H263_DEMUXER 92 //#define CONFIG_H263_MUXER 93 //#define CONFIG_M4V_DEMUXER 94 //#define CONFIG_M4V_MUXER 95 //#define CONFIG_H264_DEMUXER 96 //#define CONFIG_H264_MUXER 89 97 #define CONFIG_MPEGVIDEO_DEMUXER 90 #define CONFIG_MPEG1VIDEO_MUXER91 #define CONFIG_MPEG2VIDEO_MUXER92 #define CONFIG_MJPEG_DEMUXER93 #define CONFIG_INGENIENT_DEMUXER94 #define CONFIG_MJPEG_MUXER95 #define CONFIG_PCM_S16LE_DEMUXER96 #define CONFIG_PCM_S16LE_MUXER97 #define CONFIG_PCM_S16BE_DEMUXER98 #define CONFIG_PCM_S16BE_MUXER99 #define CONFIG_PCM_U16LE_DEMUXER100 #define CONFIG_PCM_U16LE_MUXER101 #define CONFIG_PCM_U16BE_DEMUXER102 #define CONFIG_PCM_U16BE_MUXER103 #define CONFIG_PCM_S8_DEMUXER104 #define CONFIG_PCM_S8_MUXER105 #define CONFIG_PCM_U8_DEMUXER106 #define CONFIG_PCM_U8_MUXER107 #define CONFIG_PCM_MULAW_DEMUXER108 #define CONFIG_PCM_MULAW_MUXER109 #define CONFIG_PCM_ALAW_DEMUXER110 #define CONFIG_PCM_ALAW_MUXER111 #define CONFIG_RAWVIDEO_DEMUXER112 #define CONFIG_RAWVIDEO_MUXER113 #define CONFIG_NULL_MUXER114 #define CONFIG_RM_DEMUXER115 #define CONFIG_RM_MUXER116 #define CONFIG_SEGAFILM_DEMUXER117 #define CONFIG_VMD_DEMUXER118 #define CONFIG_SMACKER_DEMUXER119 #define CONFIG_SOL_DEMUXER98 //#define CONFIG_MPEG1VIDEO_MUXER 99 //#define CONFIG_MPEG2VIDEO_MUXER 100 //#define CONFIG_MJPEG_DEMUXER 101 //#define CONFIG_INGENIENT_DEMUXER 102 //#define CONFIG_MJPEG_MUXER 103 //#define CONFIG_PCM_S16LE_DEMUXER 104 //#define CONFIG_PCM_S16LE_MUXER 105 //#define CONFIG_PCM_S16BE_DEMUXER 106 //#define CONFIG_PCM_S16BE_MUXER 107 //#define CONFIG_PCM_U16LE_DEMUXER 108 //#define CONFIG_PCM_U16LE_MUXER 109 //#define CONFIG_PCM_U16BE_DEMUXER 110 //#define CONFIG_PCM_U16BE_MUXER 111 //#define CONFIG_PCM_S8_DEMUXER 112 //#define CONFIG_PCM_S8_MUXER 113 //#define CONFIG_PCM_U8_DEMUXER 114 //#define CONFIG_PCM_U8_MUXER 115 //#define CONFIG_PCM_MULAW_DEMUXER 116 //#define CONFIG_PCM_MULAW_MUXER 117 //#define CONFIG_PCM_ALAW_DEMUXER 118 //#define CONFIG_PCM_ALAW_MUXER 119 //#define CONFIG_RAWVIDEO_DEMUXER 120 //#define CONFIG_RAWVIDEO_MUXER 121 //#define CONFIG_NULL_MUXER 122 //#define CONFIG_RM_DEMUXER 123 //#define CONFIG_RM_MUXER 124 //#define CONFIG_SEGAFILM_DEMUXER 125 //#define CONFIG_VMD_DEMUXER 126 //#define CONFIG_SMACKER_DEMUXER 127 //#define CONFIG_SOL_DEMUXER 120 128 #define CONFIG_SWF_DEMUXER 121 #define CONFIG_SWF_MUXER122 #define CONFIG_TTA_DEMUXER123 #define CONFIG_VOC_DEMUXER124 #define CONFIG_VOC_MUXER125 #define CONFIG_WAV_DEMUXER126 #define CONFIG_WAV_MUXER127 #define CONFIG_WC3_DEMUXER128 #define CONFIG_WSAUD_DEMUXER129 #define CONFIG_WSVQA_DEMUXER130 #define CONFIG_YUV4MPEGPIPE_MUXER131 #define CONFIG_YUV4MPEGPIPE_DEMUXER129 //#define CONFIG_SWF_MUXER 130 //#define CONFIG_TTA_DEMUXER 131 //#define CONFIG_VOC_DEMUXER 132 //#define CONFIG_VOC_MUXER 133 //#define CONFIG_WAV_DEMUXER 134 //#define CONFIG_WAV_MUXER 135 //#define CONFIG_WC3_DEMUXER 136 //#define CONFIG_WSAUD_DEMUXER 137 //#define CONFIG_WSVQA_DEMUXER 138 //#define CONFIG_YUV4MPEGPIPE_MUXER 139 //#define CONFIG_YUV4MPEGPIPE_DEMUXER 132 140 #define CONFIG_ZLIB 133 141 #define FFMPEG_CONFIGURATION -
TabularUnified trunk/libavformat/framehook.c ¶
r262 r263 24 24 #include "framehook.h" 25 25 26 #ifdef CONFIG_HAVE_DLFCN26 #ifdef HAVE_DLFCN_H 27 27 #include <dlfcn.h> 28 28 #endif -
TabularUnified trunk/libavformat/grab.c ¶
r256 r263 761 761 pxor_r2r(mm7,mm7); 762 762 #else 763 uint8_t *cm = cropTbl + MAX_NEG_CROP;763 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP; 764 764 #endif 765 765 -
TabularUnified trunk/libavformat/matroska.c ¶
r262 r263 177 177 MATROSKA_TRACK_DEFAULT = (1<<1), 178 178 MATROSKA_TRACK_LACING = (1<<2), 179 MATROSKA_TRACK_REAL_V = (1<<4), 179 180 MATROSKA_TRACK_SHIFT = (1<<16) 180 181 } MatroskaTrackFlags; … … 223 224 {"A_DTS" , CODEC_ID_DTS}, 224 225 {"A_VORBIS" , CODEC_ID_VORBIS}, 225 {"A_AAC /", CODEC_ID_AAC},226 {"A_AAC" , CODEC_ID_AAC}, 226 227 {"A_WAVPACK4" , CODEC_ID_WAVPACK}, 227 228 {NULL , CODEC_ID_NONE} … … 989 990 sizeof(AVPacket *)); 990 991 } else { 991 av_free(matroska->packets); 992 matroska->packets = NULL; 992 av_freep(&matroska->packets); 993 993 } 994 994 matroska->num_packets--; … … 1943 1943 if (!(id = ebml_peek_id (matroska, 1944 1944 &matroska->level_up))) 1945 break;1945 goto finish; 1946 1946 if (id != seek_id) { 1947 1947 av_log(matroska->ctx, AV_LOG_INFO, … … 1955 1955 /* read master + parse */ 1956 1956 if ((res = ebml_read_master(matroska, &id)) < 0) 1957 break;1957 goto finish; 1958 1958 switch (id) { 1959 1959 case MATROSKA_ID_CUES: … … 1972 1972 break; 1973 1973 } 1974 if (res < 0)1975 break;1976 1974 1977 1975 finish: … … 2197 2195 uint8_t *extradata = NULL; 2198 2196 int extradata_size = 0; 2197 int extradata_offset = 0; 2199 2198 track = matroska->tracks[i]; 2200 2199 … … 2246 2245 } 2247 2246 2248 if (codec_id==CODEC_ID_AAC) {2247 else if (codec_id == CODEC_ID_AAC && !track->codec_priv_size) { 2249 2248 MatroskaAudioTrack *audiotrack = (MatroskaAudioTrack *) track; 2250 2249 int profile = matroska_aac_profile(track->codec_id); … … 2266 2265 } 2267 2266 2267 else if (codec_id == CODEC_ID_RV10 || codec_id == CODEC_ID_RV20 || 2268 codec_id == CODEC_ID_RV30 || codec_id == CODEC_ID_RV40) { 2269 extradata_offset = 26; 2270 track->codec_priv_size -= extradata_offset; 2271 track->flags |= MATROSKA_TRACK_REAL_V; 2272 } 2273 2268 2274 if (codec_id == CODEC_ID_NONE) { 2269 2275 av_log(matroska->ctx, AV_LOG_INFO, … … 2294 2300 return AVERROR_NOMEM; 2295 2301 st->codec->extradata_size = track->codec_priv_size; 2296 memcpy(st->codec->extradata, track->codec_priv,2302 memcpy(st->codec->extradata,track->codec_priv+extradata_offset, 2297 2303 track->codec_priv_size); 2298 2304 } … … 2345 2351 } 2346 2352 2353 static inline int 2354 rv_offset(uint8_t *data, int slice, int slices) 2355 { 2356 return LE_32(data+8*slice+4) + 8*slices; 2357 } 2358 2347 2359 static int 2348 2360 matroska_parse_blockgroup (MatroskaDemuxContext *matroska, … … 2384 2396 origdata = data; 2385 2397 2386 /* first byte(s): blocknum */2398 /* first byte(s): tracknum */ 2387 2399 if ((n = matroska_ebmlnum_uint(data, size, &num)) < 0) { 2388 2400 av_log(matroska->ctx, AV_LOG_ERROR, … … 2495 2507 2496 2508 if (res == 0) { 2509 int real_v = matroska->tracks[track]->flags & MATROSKA_TRACK_REAL_V; 2497 2510 for (n = 0; n < laces; n++) { 2498 2511 uint64_t timecode = AV_NOPTS_VALUE; 2499 2500 pkt = av_mallocz(sizeof(AVPacket)); 2501 /* XXX: prevent data copy... */ 2502 if (av_new_packet(pkt,lace_size[n]) < 0) { 2503 res = AVERROR_NOMEM; 2504 break; 2512 int slice, slices = 1; 2513 2514 if (real_v) { 2515 slices = *data++ + 1; 2516 lace_size[n]--; 2505 2517 } 2506 2518 if (cluster_time != (uint64_t)-1 && n == 0) { … … 2510 2522 /* FIXME: duration */ 2511 2523 2512 memcpy(pkt->data, data, lace_size[n]); 2524 for (slice=0; slice<slices; slice++) { 2525 int slice_size, slice_offset = 0; 2526 if (real_v) 2527 slice_offset = rv_offset(data, slice, slices); 2528 if (slice+1 == slices) 2529 slice_size = lace_size[n] - slice_offset; 2530 else 2531 slice_size = rv_offset(data, slice+1, slices) - slice_offset; 2532 pkt = av_mallocz(sizeof(AVPacket)); 2533 /* XXX: prevent data copy... */ 2534 if (av_new_packet(pkt, slice_size) < 0) { 2535 res = AVERROR_NOMEM; 2536 n = laces-1; 2537 break; 2538 } 2539 memcpy (pkt->data, data+slice_offset, slice_size); 2540 2541 if (n == 0) 2542 pkt->flags = is_keyframe; 2543 pkt->stream_index = 2544 matroska->tracks[track]->stream_index; 2545 2546 pkt->pts = timecode; 2547 pkt->pos = pos; 2548 2549 matroska_queue_packet(matroska, pkt); 2550 } 2513 2551 data += lace_size[n]; 2514 if (n == 0)2515 pkt->flags = is_keyframe;2516 pkt->stream_index =2517 matroska->tracks[track]->stream_index;2518 2519 pkt->pts = timecode;2520 pkt->pos= pos;2521 2522 matroska_queue_packet(matroska, pkt);2523 2552 } 2524 2553 } -
TabularUnified trunk/libavformat/mov.c ¶
r262 r263 415 415 else if(type == MKTAG('m', '1', 'a', ' ')) 416 416 st->codec->codec_id = CODEC_ID_MP2; 417 else if(type == MKTAG('s', 'u', 'b', 'p')) { 418 st->codec->codec_type = CODEC_TYPE_SUBTITLE; 419 st->codec->codec_id = CODEC_ID_DVD_SUBTITLE; 420 } 417 421 get_be32(pb); /* component manufacture */ 418 422 get_be32(pb); /* component flags */ -
TabularUnified trunk/libavformat/mpegts.c ¶
r261 r263 1133 1133 } 1134 1134 1135 void set_service_cb(void *opaque, int ret)1135 static void set_service_cb(void *opaque, int ret) 1136 1136 { 1137 1137 MpegTSContext *ts = opaque; -
TabularUnified trunk/libavformat/mxf.c ¶
r259 r263 372 372 bytes_read += size + 4; 373 373 dprintf("tag 0x%04X, size %d\n", tag, size); 374 if (!size) /* ignore empty tag, needed for some files with empty UMID tag */ 374 if (!size) { /* ignore empty tag, needed for some files with empty UMID tag */ 375 av_log(mxf->fc, AV_LOG_ERROR, "local tag 0x%04X with 0 size\n", tag); 375 376 continue; 377 } 376 378 switch (tag) { 377 379 case 0x3C0A: … … 676 678 /* PictureEssenceCoding */ 677 679 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x02,0x02,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@ML I-Frame */ 680 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x02,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@HL I-Frame */ 678 681 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x04,0x03,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* 422P@HL Long GoP */ 679 682 { { 0x06,0x0E,0x2B,0x34,0x04,0x01,0x01,0x03,0x04,0x01,0x02,0x02,0x01,0x01,0x11,0x00 }, CODEC_ID_MPEG2VIDEO, Frame }, /* MP@ML Long GoP */ … … 894 897 st->codec->height = descriptor->height; 895 898 st->codec->bits_per_sample = descriptor->bits_per_sample; /* Uncompressed */ 899 st->need_parsing = 2; /* only parse headers */ 896 900 } else if (st->codec->codec_type == CODEC_TYPE_AUDIO) { 897 901 container_ul = mxf_get_codec_ul(mxf_sound_essence_container_uls, &descriptor->essence_container_ul); -
TabularUnified trunk/libavformat/os_support.c ¶
r256 r263 2 2 * Various utilities for ffmpeg system 3 3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard 4 * copyright (c) 2002 Francois Revol 4 5 * 5 6 * This file is part of FFmpeg. … … 54 55 } 55 56 56 #if !defined(CONFIG_WINCE) 57 #if !defined(HAVE_LOCALTIME_R) 57 #if !defined(CONFIG_WINCE) && !defined(HAVE_LOCALTIME_R) 58 58 struct tm *localtime_r(const time_t *t, struct tm *tp) 59 59 { … … 66 66 return tp; 67 67 } 68 #endif /* !defined(HAVE_LOCALTIME_R) */ 69 #endif /* !defined(CONFIG_WINCE) */ 68 #endif /* !defined(CONFIG_WINCE) && !defined(HAVE_LOCALTIME_R) */ 69 70 #if !defined(HAVE_INET_ATON) && defined(CONFIG_NETWORK) 71 #include <stdlib.h> 72 #include <strings.h> 73 #include "barpainet.h" 74 75 int inet_aton (const char * str, struct in_addr * add) 76 { 77 const char * pch = str; 78 unsigned int add1 = 0, add2 = 0, add3 = 0, add4 = 0; 79 80 add1 = atoi(pch); 81 pch = strpbrk(pch,"."); 82 if (pch == 0 || ++pch == 0) goto done; 83 add2 = atoi(pch); 84 pch = strpbrk(pch,"."); 85 if (pch == 0 || ++pch == 0) goto done; 86 add3 = atoi(pch); 87 pch = strpbrk(pch,"."); 88 if (pch == 0 || ++pch == 0) goto done; 89 add4 = atoi(pch); 90 91 done: 92 add->s_addr=(add4<<24)+(add3<<16)+(add2<<8)+add1; 93 94 return 1; 95 } 96 #endif /* !defined(HAVE_INET_ATON) && defined(CONFIG_NETWORK) */ -
TabularUnified trunk/libavformat/os_support.h ¶
r256 r263 48 48 #include <stdlib.h> 49 49 static inline int usleep(unsigned int t) { return _sleep2(t / 1000); } 50 static inline int strcasecmp(const char* s1, const char* s2) { return stricmp(s1,s2); }50 //static inline int strcasecmp(const char* s1, const char* s2) { return stricmp(s1,s2); } 51 51 #endif 52 52 -
TabularUnified trunk/libavformat/riff.c ¶
r262 r263 201 201 { CODEC_ID_PCM_S16LE, MKTAG('R', 'A', 'W', 'A') }, 202 202 { CODEC_ID_MP3, MKTAG('L', 'A', 'M', 'E') }, 203 { CODEC_ID_MP3, MKTAG('M', 'P', '3', ' ') }, 203 204 { 0, 0 }, 204 205 }; -
TabularUnified trunk/libavformat/rtsp.c ¶
r262 r263 320 320 rtp_payload_data_t *rtp_payload_data = &rtsp_st->rtp_payload_data; 321 321 322 // TODO (Replace with rtsp_next_attr_and_value)323 322 /* loop on each attribute */ 324 for(;;) { 325 skip_spaces(&p); 326 if (*p == '\0') 327 break; 328 get_word_sep(attr, sizeof(attr), "=", &p); 329 if (*p == '=') 330 p++; 331 get_word_sep(value, sizeof(value), ";", &p); 332 if (*p == ';') 333 p++; 323 while(rtsp_next_attr_and_value(&p, attr, sizeof(attr), value, sizeof(value))) 324 { 334 325 /* grab the codec extra_data from the config parameter of the fmtp line */ 335 326 sdp_parse_fmtp_config(codec, attr, value); -
TabularUnified trunk/libavformat/sierravmd.c ¶
r261 r263 46 46 int audio_stream_index; 47 47 48 unsigned int audio_type;49 unsigned int audio_samplerate;50 unsigned int audio_bits;51 unsigned int audio_channels;52 53 48 unsigned int frame_count; 54 49 unsigned int frames_per_block; … … 58 53 int sample_rate; 59 54 int64_t audio_sample_counter; 60 int audio_frame_divisor;61 int audio_block_align;62 55 int skiphdr; 63 56 … … 77 70 /* only return half certainty since this check is a bit sketchy */ 78 71 return AVPROBE_SCORE_MAX / 2; 79 }80 81 /* This is a support function to determine the duration, in sample82 * frames, of a particular audio chunk, taking into account silent83 * encodings. */84 static int vmd_calculate_audio_duration(unsigned char *audio_chunk,85 int audio_chunk_size, int block_align)86 {87 unsigned char *p = audio_chunk + 16;88 unsigned char *p_end = audio_chunk + audio_chunk_size;89 int total_samples = 0;90 unsigned int sound_flags;91 92 if (audio_chunk_size < 16)93 return 0;94 if (audio_chunk_size == block_align + 16)95 return block_align;96 if (audio_chunk_size == block_align + 17)97 return block_align;98 99 sound_flags = LE_32(p);100 p += 4;101 while (p < p_end) {102 total_samples += block_align;103 if ((sound_flags & 0x01) == 0)104 p += block_align;105 sound_flags >>= 1;106 }107 av_log(NULL,0,"Got %i samples for size %i map %08X\n", total_samples, audio_chunk_size, LE_32(audio_chunk));108 109 return total_samples;110 72 } 111 73 … … 115 77 VmdDemuxContext *vmd = (VmdDemuxContext *)s->priv_data; 116 78 ByteIOContext *pb = &s->pb; 117 AVStream *st ;79 AVStream *st, *vst; 118 80 unsigned int toc_offset; 119 81 unsigned char *raw_frame_table; … … 122 84 int i, j; 123 85 unsigned int total_frames; 124 int64_t video_pts_inc = 0;125 int64_t current_video_pts = 0 ;86 int64_t pts_inc = 1; 87 int64_t current_video_pts = 0, current_audio_pts = 0; 126 88 unsigned char chunk[BYTES_PER_FRAME_RECORD]; 127 int lastframe = 0; 89 int num, den; 90 int sound_buffers; 128 91 129 92 /* fetch the main header, including the 2 header length bytes */ … … 132 95 return AVERROR_IO; 133 96 134 vmd->audio_sample_counter = 0;135 vmd->audio_frame_divisor = 1;136 vmd->audio_block_align = 1;137 138 97 /* start up the decoders */ 139 st = av_new_stream(s, 0);140 if (! st)98 vst = av_new_stream(s, 0); 99 if (!vst) 141 100 return AVERROR_NOMEM; 142 av_set_pts_info(st, 33, 1, 90000); 143 vmd->video_stream_index = st->index; 144 st->codec->codec_type = CODEC_TYPE_VIDEO; 145 st->codec->codec_id = CODEC_ID_VMDVIDEO; 146 st->codec->codec_tag = 0; /* no fourcc */ 147 st->codec->width = LE_16(&vmd->vmd_header[12]); 148 st->codec->height = LE_16(&vmd->vmd_header[14]); 149 st->codec->time_base.num = 1; 150 st->codec->time_base.den = 10; 151 st->codec->extradata_size = VMD_HEADER_SIZE; 152 st->codec->extradata = av_mallocz(VMD_HEADER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); 153 memcpy(st->codec->extradata, vmd->vmd_header, VMD_HEADER_SIZE); 101 av_set_pts_info(vst, 33, 1, 10); 102 vmd->video_stream_index = vst->index; 103 vst->codec->codec_type = CODEC_TYPE_VIDEO; 104 vst->codec->codec_id = CODEC_ID_VMDVIDEO; 105 vst->codec->codec_tag = 0; /* no fourcc */ 106 vst->codec->width = LE_16(&vmd->vmd_header[12]); 107 vst->codec->height = LE_16(&vmd->vmd_header[14]); 108 vst->codec->extradata_size = VMD_HEADER_SIZE; 109 vst->codec->extradata = av_mallocz(VMD_HEADER_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); 110 memcpy(vst->codec->extradata, vmd->vmd_header, VMD_HEADER_SIZE); 154 111 155 112 /* if sample rate is 0, assume no audio */ … … 159 116 if (!st) 160 117 return AVERROR_NOMEM; 161 av_set_pts_info(st, 33, 1, 90000);162 118 vmd->audio_stream_index = st->index; 163 119 st->codec->codec_type = CODEC_TYPE_AUDIO; 164 120 st->codec->codec_id = CODEC_ID_VMDAUDIO; 165 121 st->codec->codec_tag = 0; /* no fourcc */ 166 st->codec->channels = vmd->audio_channels =(vmd->vmd_header[811] & 0x80) ? 2 : 1;122 st->codec->channels = (vmd->vmd_header[811] & 0x80) ? 2 : 1; 167 123 st->codec->sample_rate = vmd->sample_rate; 168 st->codec->block_align = vmd->audio_block_align = 169 LE_16(&vmd->vmd_header[806]); 124 st->codec->block_align = LE_16(&vmd->vmd_header[806]); 170 125 if (st->codec->block_align & 0x8000) { 171 126 st->codec->bits_per_sample = 16; 172 127 st->codec->block_align = -(st->codec->block_align - 0x10000); 173 vmd->audio_block_align = -(vmd->audio_block_align - 0x10000);174 128 } else { 175 129 st->codec->bits_per_sample = 8; … … 178 132 st->codec->bits_per_sample * st->codec->channels; 179 133 180 /* for calculating pts */ 181 vmd->audio_frame_divisor = st->codec->channels; 182 183 video_pts_inc = 90000; 184 video_pts_inc *= st->codec->block_align; 185 video_pts_inc /= st->codec->sample_rate; 186 video_pts_inc /= st->codec->channels; 187 } else { 188 /* if no audio, assume 10 frames/second */ 189 video_pts_inc = 90000 / 10; 134 /* calculate pts */ 135 num = st->codec->block_align; 136 den = st->codec->sample_rate * st->codec->channels; 137 av_reduce(&den, &num, den, num, (1UL<<31)-1); 138 av_set_pts_info(vst, 33, num, den); 139 av_set_pts_info(st, 33, num, den); 140 pts_inc = num; 190 141 } 191 142 … … 197 148 raw_frame_table = NULL; 198 149 vmd->frame_table = NULL; 150 sound_buffers = LE_16(&vmd->vmd_header[808]); 199 151 raw_frame_table_size = vmd->frame_count * 6; 200 152 raw_frame_table = av_malloc(raw_frame_table_size); … … 203 155 return -1; 204 156 } 205 vmd->frame_table = av_malloc( vmd->frame_count * vmd->frames_per_block* sizeof(vmd_frame_t));157 vmd->frame_table = av_malloc((vmd->frame_count * vmd->frames_per_block + sound_buffers) * sizeof(vmd_frame_t)); 206 158 if (!raw_frame_table || !vmd->frame_table) { 207 159 av_free(raw_frame_table); … … 233 185 switch(type) { 234 186 case 1: /* Audio Chunk */ 235 vmd->frame_table[total_frames].frame_offset = current_offset; 236 vmd->frame_table[total_frames].stream_index = vmd->audio_stream_index; 237 vmd->frame_table[total_frames].frame_size = size; 238 memcpy(vmd->frame_table[total_frames].frame_record, chunk, BYTES_PER_FRAME_RECORD); 239 total_frames++; 187 /* first audio chunk contains several audio buffers */ 188 if(current_audio_pts){ 189 vmd->frame_table[total_frames].frame_offset = current_offset; 190 vmd->frame_table[total_frames].stream_index = vmd->audio_stream_index; 191 vmd->frame_table[total_frames].frame_size = size; 192 memcpy(vmd->frame_table[total_frames].frame_record, chunk, BYTES_PER_FRAME_RECORD); 193 vmd->frame_table[total_frames].pts = current_audio_pts; 194 total_frames++; 195 current_audio_pts += pts_inc; 196 }else{ 197 uint32_t flags; 198 int k; 199 int noff; 200 int64_t pos; 201 202 pos = url_ftell(pb); 203 url_fseek(pb, current_offset, SEEK_SET); 204 flags = get_le32(pb); 205 noff = 4; 206 url_fseek(pb, pos, SEEK_SET); 207 av_log(s, AV_LOG_DEBUG, "Sound mapping = %08X (%i bufs)\n", flags, sound_buffers); 208 for(k = 0; k < sound_buffers - 1; k++){ 209 if(flags & 1) { /* silent block */ 210 vmd->frame_table[total_frames].frame_size = 0; 211 }else{ 212 vmd->frame_table[total_frames].frame_size = st->codec->block_align + (st->codec->block_align & 1); 213 } 214 noff += vmd->frame_table[total_frames].frame_size; 215 vmd->frame_table[total_frames].frame_offset = current_offset + noff; 216 vmd->frame_table[total_frames].stream_index = vmd->audio_stream_index; 217 memcpy(vmd->frame_table[total_frames].frame_record, chunk, BYTES_PER_FRAME_RECORD); 218 vmd->frame_table[total_frames].pts = current_audio_pts; 219 total_frames++; 220 current_audio_pts += pts_inc; 221 flags >>= 1; 222 } 223 } 240 224 break; 241 225 case 2: /* Video Chunk */ 242 226 vmd->frame_table[total_frames].frame_offset = current_offset; 227 vmd->frame_table[total_frames].stream_index = vmd->video_stream_index; 243 228 vmd->frame_table[total_frames].frame_size = size; 244 vmd->frame_table[total_frames].stream_index = vmd->video_stream_index;245 229 memcpy(vmd->frame_table[total_frames].frame_record, chunk, BYTES_PER_FRAME_RECORD); 246 230 vmd->frame_table[total_frames].pts = current_video_pts; 247 if (lastframe) {248 vmd->frame_table[lastframe].pts = current_video_pts - video_pts_inc;249 }250 lastframe = total_frames;251 231 total_frames++; 252 232 break; … … 254 234 current_offset += size; 255 235 } 256 current_video_pts += video_pts_inc;236 current_video_pts += pts_inc; 257 237 } 258 238 … … 292 272 } 293 273 pkt->stream_index = frame->stream_index; 294 if (frame->frame_record[0] == 0x02) 295 pkt->pts = frame->pts; 296 else { 297 pkt->pts = vmd->audio_sample_counter; 298 pkt->pts *= 90000; 299 pkt->pts /= vmd->sample_rate; 300 pkt->pts /= vmd->audio_channels; 301 vmd->audio_sample_counter += vmd_calculate_audio_duration( 302 pkt->data, pkt->size, vmd->audio_block_align); 303 304 } 305 av_log(NULL, AV_LOG_INFO, " dispatching %s frame with %d bytes and pts %"PRId64" (%0.1f sec)\n", 274 pkt->pts = frame->pts; 275 av_log(NULL, AV_LOG_INFO, " dispatching %s frame with %d bytes and pts %"PRId64"\n", 306 276 (frame->frame_record[0] == 0x02) ? "video" : "audio", 307 277 frame->frame_size + BYTES_PER_FRAME_RECORD, 308 pkt->pts , (float)(pkt->pts / 90000.0));278 pkt->pts); 309 279 310 280 vmd->current_frame++; -
TabularUnified trunk/libavformat/swf.c ¶
r261 r263 451 451 default: 452 452 /* not supported */ 453 av_log(s, AV_LOG_ERROR, "swf doesnt support that sample rate, choose from (44100, 22050, 11025)\n"); 453 454 av_free(swf->audio_fifo); 454 455 av_free(swf); -
TabularUnified trunk/libavformat/utils.c ¶
r262 r263 276 276 { 277 277 AVInputFormat *fmt1, *fmt; 278 int score, score_max , i=0;278 int score, score_max; 279 279 280 280 fmt = NULL; … … 283 283 if (!is_opened && !(fmt1->flags & AVFMT_NOFILE)) 284 284 continue; 285 i++;286 285 score = 0; 287 286 if (fmt1->read_probe) { … … 406 405 goto fail; 407 406 408 if (pb )407 if (pb && !ic->data_offset) 409 408 ic->data_offset = url_ftell(&ic->pb); 410 409 … … 1165 1164 int64_t pos_min, pos_max, pos, pos_limit; 1166 1165 int64_t ts_min, ts_max, ts; 1167 int64_t start_pos, filesize; 1168 int index, no_change; 1166 int index; 1169 1167 AVStream *st; 1170 1168 … … 1214 1212 } 1215 1213 1214 pos= av_gen_search(s, stream_index, target_ts, pos_min, pos_max, pos_limit, ts_min, ts_max, flags, &ts, avif->read_timestamp); 1215 if(pos<0) 1216 return -1; 1217 1218 /* do the seek */ 1219 url_fseek(&s->pb, pos, SEEK_SET); 1220 1221 av_update_cur_dts(s, st, ts); 1222 1223 return 0; 1224 } 1225 1226 /** 1227 * Does a binary search using read_timestamp(). 1228 * this isnt supposed to be called directly by a user application, but by demuxers 1229 * @param target_ts target timestamp in the time base of the given stream 1230 * @param stream_index stream number 1231 */ 1232 int64_t av_gen_search(AVFormatContext *s, int stream_index, int64_t target_ts, int64_t pos_min, int64_t pos_max, int64_t pos_limit, int64_t ts_min, int64_t ts_max, int flags, int64_t *ts_ret, int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )){ 1233 int64_t pos, ts; 1234 int64_t start_pos, filesize; 1235 int no_change; 1236 1237 #ifdef DEBUG_SEEK 1238 av_log(s, AV_LOG_DEBUG, "gen_seek: %d %"PRId64"\n", stream_index, target_ts); 1239 #endif 1240 1216 1241 if(ts_min == AV_NOPTS_VALUE){ 1217 1242 pos_min = s->data_offset; 1218 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);1243 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX); 1219 1244 if (ts_min == AV_NOPTS_VALUE) 1220 1245 return -1; … … 1227 1252 do{ 1228 1253 pos_max -= step; 1229 ts_max = avif->read_timestamp(s, stream_index, &pos_max, pos_max + step);1254 ts_max = read_timestamp(s, stream_index, &pos_max, pos_max + step); 1230 1255 step += step; 1231 1256 }while(ts_max == AV_NOPTS_VALUE && pos_max >= step); … … 1235 1260 for(;;){ 1236 1261 int64_t tmp_pos= pos_max + 1; 1237 int64_t tmp_ts= avif->read_timestamp(s, stream_index, &tmp_pos, INT64_MAX);1262 int64_t tmp_ts= read_timestamp(s, stream_index, &tmp_pos, INT64_MAX); 1238 1263 if(tmp_ts == AV_NOPTS_VALUE) 1239 1264 break; … … 1279 1304 start_pos= pos; 1280 1305 1281 ts = avif->read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -11306 ts = read_timestamp(s, stream_index, &pos, INT64_MAX); //may pass pos_limit instead of -1 1282 1307 if(pos == pos_max) 1283 1308 no_change++; … … 1303 1328 #ifdef DEBUG_SEEK 1304 1329 pos_min = pos; 1305 ts_min = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);1330 ts_min = read_timestamp(s, stream_index, &pos_min, INT64_MAX); 1306 1331 pos_min++; 1307 ts_max = avif->read_timestamp(s, stream_index, &pos_min, INT64_MAX);1332 ts_max = read_timestamp(s, stream_index, &pos_min, INT64_MAX); 1308 1333 av_log(s, AV_LOG_DEBUG, "pos=0x%"PRIx64" %"PRId64"<=%"PRId64"<=%"PRId64"\n", 1309 1334 pos, ts_min, target_ts, ts_max); 1310 1335 #endif 1311 /* do the seek */ 1312 url_fseek(&s->pb, pos, SEEK_SET); 1313 1314 av_update_cur_dts(s, st, ts); 1315 1316 return 0; 1336 *ts_ret= ts; 1337 return pos; 1317 1338 } 1318 1339 -
TabularUnified trunk/libavutil/avutil.h ¶
r261 r263 35 35 #define AV_TOSTRING(s) #s 36 36 37 #define LIBAVUTIL_VERSION_INT ((49<<16)+( 0<<8)+2)38 #define LIBAVUTIL_VERSION 49. 0.237 #define LIBAVUTIL_VERSION_INT ((49<<16)+(1<<8)+0) 38 #define LIBAVUTIL_VERSION 49.1.0 39 39 #define LIBAVUTIL_BUILD LIBAVUTIL_VERSION_INT 40 40 … … 79 79 PIX_FMT_YUV411P, ///< Planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) 80 80 PIX_FMT_RGB565, ///< Packed RGB 5:6:5, 16bpp, (msb) 5R 6G 5B(lsb), in cpu endianness 81 PIX_FMT_RGB555, ///< Packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), in cpu endianness most significant bit to 181 PIX_FMT_RGB555, ///< Packed RGB 5:5:5, 16bpp, (msb)1A 5R 5G 5B(lsb), in cpu endianness most significant bit to 0 82 82 PIX_FMT_GRAY8, ///< Y , 8bpp 83 83 PIX_FMT_MONOWHITE, ///< Y , 1bpp, 1 is white -
TabularUnified trunk/libavutil/common.h ¶
r262 r263 85 85 #endif 86 86 87 #ifndef EMULATE_INTTYPES88 87 # include <inttypes.h> 89 #else90 typedef signed char int8_t;91 typedef signed short int16_t;92 typedef signed int int32_t;93 typedef unsigned char uint8_t;94 typedef unsigned short uint16_t;95 typedef unsigned int uint32_t;96 typedef signed long long int64_t;97 typedef unsigned long long uint64_t;98 #endif /* EMULATE_INTTYPES */99 88 100 89 #ifndef PRId64 … … 156 145 #ifndef UINT64_MAX 157 146 #define UINT64_MAX uint64_t_C(0xFFFFFFFFFFFFFFFF) 158 #endif159 160 #ifdef EMULATE_FAST_INT161 typedef signed char int_fast8_t;162 typedef signed int int_fast16_t;163 typedef signed int int_fast32_t;164 typedef unsigned char uint_fast8_t;165 typedef unsigned int uint_fast16_t;166 typedef unsigned int uint_fast32_t;167 typedef uint64_t uint_fast64_t;168 147 #endif 169 148 … … 330 309 * \param GET_BYTE gets utf-8 encoded bytes from any proper source. It can be 331 310 * a function or a statement whose return value or evaluated value is of type 332 * uint8_t. It will be execuded up to 4 times. 311 * uint8_t. It will be executed up to 4 times for values in the valid utf-8 range, 312 * and up to 7 times in the general case. 333 313 * \param ERROR action that should be taken when an invalid utf-8 byte is returned 334 314 * from GET_BYTE. It should be a statement that jumps out of the macro, … … 362 342 * It could be a function or a statement, and uses tmp as the input byte. 363 343 * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be 364 * executed up to 4 times, depending on the length of the converted 344 * executed up to 4 times for values in the valid utf-8 range and up to 345 * 7 times in the general case, depending on the length of the converted 365 346 * unicode character. 366 347 */ -
TabularUnified trunk/libavutil/config.h ¶
r261 r263 16 16 //#define HAVE_BUILTIN_VECTOR ///???? 17 17 #define HAVE_LRINTF 18 #define HAVE_THREADS 18 19 #define CONFIG_GPL 19 20 #define CONFIG_ENCODERS -
TabularUnified trunk/libavutil/internal.h ¶
r261 r263 31 31 #endif 32 32 33 # 34 # 35 # 33 #ifndef ENODATA 34 # define ENODATA 61 35 #endif 36 36 37 37 #include "bswap.h" … … 39 39 #include <stddef.h> 40 40 #ifndef offsetof 41 # define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F))41 # define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F)) 42 42 #endif 43 43 … … 52 52 # ifdef CONFIG_WINCE 53 53 # define perror(a) 54 # define abort() 54 55 # endif 55 56 … … 58 59 /* OS/2 EMX */ 59 60 60 # include <float.h>61 # include <float.h> 61 62 62 63 #endif /* !__MINGW32__ && CONFIG_OS2 */ 63 64 64 # 65 # 66 # 65 #ifdef USE_FASTMEMCPY 66 # include "libvo/fastmemcpy.h" 67 #endif 67 68 68 69 // Use rip-relative addressing if compiling PIC code on x86-64. 69 # if defined(__MINGW32__) || defined(__CYGWIN__) || \ 70 defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__)) 71 # if defined(ARCH_X86_64) && defined(PIC) 72 # define MANGLE(a) "_" #a"(%%rip)" 73 # else 74 # define MANGLE(a) "_" #a 75 # endif 70 #if defined(__MINGW32__) || defined(__CYGWIN__) || \ 71 defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__)) 72 # if defined(ARCH_X86_64) && defined(PIC) 73 # define MANGLE(a) "_" #a"(%%rip)" 76 74 # else 77 # if defined(ARCH_X86_64) && defined(PIC) 78 # define MANGLE(a) #a"(%%rip)" 79 # elif defined(CONFIG_DARWIN) 80 # define MANGLE(a) "_" #a 81 # else 82 # define MANGLE(a) #a 83 # endif 84 # endif 75 # define MANGLE(a) "_" #a 76 # endif 77 #else 78 # if defined(ARCH_X86_64) && defined(PIC) 79 # define MANGLE(a) #a"(%%rip)" 80 # elif defined(CONFIG_DARWIN) 81 # define MANGLE(a) "_" #a 82 # else 83 # define MANGLE(a) #a 84 # endif 85 #endif 85 86 86 87 /* debug stuff */ 87 88 88 # 89 # 90 # 91 # 89 #if !defined(DEBUG) && !defined(NDEBUG) 90 # define NDEBUG 91 #endif 92 #include <assert.h> 92 93 93 94 /* dprintf macros */ 94 # ifdef DEBUG 95 # define dprintf(fmt,...) av_log(NULL, AV_LOG_DEBUG, fmt, __VA_ARGS__) 96 # else 97 # define dprintf(fmt,...) 98 # endif 99 100 # ifdef CONFIG_WINCE 101 # define abort() 102 # endif 103 104 # define av_abort() do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0) 105 106 extern const uint32_t inverse[256]; 95 #ifdef DEBUG 96 # define dprintf(fmt,...) av_log(NULL, AV_LOG_DEBUG, fmt, __VA_ARGS__) 97 #else 98 # define dprintf(fmt,...) 99 #endif 100 101 #define av_abort() do { av_log(NULL, AV_LOG_ERROR, "Abort at %s:%d\n", __FILE__, __LINE__); abort(); } while (0) 102 103 /* math */ 104 105 extern const uint32_t ff_inverse[256]; 107 106 108 107 #if defined(ARCH_X86) … … 113 112 "mull %3"\ 114 113 :"=d"(ret),"=a"(dmy)\ 115 :"1"(a),"g"( inverse[b])\114 :"1"(a),"g"(ff_inverse[b])\ 116 115 );\ 117 116 ret;\ … … 124 123 "umull %1, %0, %2, %3"\ 125 124 :"=&r"(ret),"=&r"(dmy)\ 126 :"r"(a),"r"( inverse[b])\125 :"r"(a),"r"(ff_inverse[b])\ 127 126 );\ 128 127 ret;\ 129 128 }) 130 129 #elif defined(CONFIG_FASTDIV) 131 # define FASTDIV(a,b) ((uint32_t)((((uint64_t)a)* inverse[b])>>32))130 # define FASTDIV(a,b) ((uint32_t)((((uint64_t)a)*ff_inverse[b])>>32)) 132 131 #else 133 132 # define FASTDIV(a,b) ((a)/(b)) 134 133 #endif 135 134 136 /* math */137 135 extern FF_IMPORT_ATTR const uint8_t ff_sqrt_tab[128]; 138 136 -
TabularUnified trunk/libavutil/log.h ¶
r256 r263 34 34 Needed because av_log is in libavcodec and has no visibility 35 35 of AVIn/OutputFormat */ 36 struct AVOption *option;36 const struct AVOption *option; 37 37 }; 38 38 -
TabularUnified trunk/libavutil/mem.c ¶
r256 r263 48 48 { 49 49 void *ptr; 50 #ifdef MEMALIGN_HACK50 #ifdef CONFIG_MEMALIGN_HACK 51 51 long diff; 52 52 #endif … … 56 56 return NULL; 57 57 58 #ifdef MEMALIGN_HACK58 #ifdef CONFIG_MEMALIGN_HACK 59 59 ptr = malloc(size+16); 60 60 if(!ptr) … … 104 104 void *av_realloc(void *ptr, unsigned int size) 105 105 { 106 #ifdef MEMALIGN_HACK106 #ifdef CONFIG_MEMALIGN_HACK 107 107 int diff; 108 108 #endif … … 112 112 return NULL; 113 113 114 #ifdef MEMALIGN_HACK114 #ifdef CONFIG_MEMALIGN_HACK 115 115 //FIXME this isn't aligned correctly, though it probably isn't needed 116 116 if(!ptr) return av_malloc(size); … … 131 131 /* XXX: this test should not be needed on most libcs */ 132 132 if (ptr) 133 #ifdef MEMALIGN_HACK133 #ifdef CONFIG_MEMALIGN_HACK 134 134 free(ptr - ((char*)ptr)[-1]); 135 135 #else -
TabularUnified trunk/libmpdemux/asfheader.c ¶
r247 r263 248 248 int read_asf_header(demuxer_t *demuxer,struct asf_priv* asf){ 249 249 int hdr_len = asf->header.objh.size - sizeof(asf->header); 250 int hdr_skip = 0; 250 251 char *hdr = NULL; 251 252 char guid_buffer[16]; … … 268 269 269 270 if (hdr_len > 1024 * 1024) { 270 dprintf(" FATAL:header size bigger than 1MB (%d)!\n"271 dprintf("header size bigger than 1MB (%d)!\n" 271 272 "Please contact authors, and upload/send this file.\n", 272 hdr_len); 273 return 0; 273 hdr_len); 274 hdr_skip = hdr_len - 1024 * 1024; 275 hdr_len = 1024 * 1024; 274 276 } 275 277 hdr = malloc(hdr_len); … … 279 281 } 280 282 stream_read(demuxer->stream, hdr, hdr_len); 283 if (hdr_skip) 284 stream_skip(demuxer->stream, hdr_skip); 281 285 if (stream_eof(demuxer->stream)) { 282 286 dprintf("EOF while reading asf header, broken/incomplete file?\n"); -
TabularUnified trunk/libmpdemux/demux_audio.c ¶
r261 r263 154 154 }; 155 155 156 extern void free_sh_audio(sh_audio_t* sh);157 156 extern void print_wave_header(WAVEFORMATEX *h); 158 157 … … 543 542 if (tmp_srate > 2) 544 543 { 545 free_sh_audio(sh_audio);546 544 return 0; 547 545 } … … 1039 1037 "Audio only files", 1040 1038 DEMUXER_TYPE_AUDIO, 1041 1, // unsafe autodetect1039 0, // unsafe autodetect 1042 1040 demux_audio_open, 1043 1041 demux_audio_fill_buffer, -
TabularUnified trunk/libmpdemux/demux_lavf.c ¶
r262 r263 108 108 const CodecTag mp_wav_tags[] = { 109 109 { CODEC_ID_ADPCM_4XM, MKTAG('4', 'X', 'M', 'A')}, 110 { CODEC_ID_ADPCM_EA, MKTAG('A', 'D', 'E', 'A')}, 111 { CODEC_ID_ADPCM_IMA_WS, MKTAG('A', 'I', 'W', 'S')}, 112 { CODEC_ID_INTERPLAY_DPCM,MKTAG('I', 'N', 'P', 'A')}, 113 { CODEC_ID_DSICINAUDIO, MKTAG('D', 'C', 'I', 'A')}, 110 114 { CODEC_ID_PCM_S24BE, MKTAG('i', 'n', '2', '4')}, 111 115 { CODEC_ID_PCM_S8, MKTAG('t', 'w', 'o', 's')}, 116 { CODEC_ID_ROQ_DPCM, MKTAG('R', 'o', 'Q', 'A')}, 117 { CODEC_ID_SHORTEN, MKTAG('s', 'h', 'r', 'n')}, 112 118 { CODEC_ID_WAVPACK, MKTAG('W', 'V', 'P', 'K')}, 119 { CODEC_ID_XAN_DPCM, MKTAG('A', 'x', 'a', 'n')}, 113 120 { CODEC_ID_TTA, MKTAG('T', 'T', 'A', '1')}, 114 { CODEC_ID_SHORTEN, MKTAG('s', 'h', 'r', 'n')},115 121 { 0, 0 }, 116 122 }; 117 123 118 124 const CodecTag mp_bmp_tags[] = { 119 { CODEC_ID_XAN_WC3, MKTAG('W', 'C', '3', 'V')}, 125 { CODEC_ID_DSICINVIDEO, MKTAG('D', 'C', 'I', 'V')}, 126 { CODEC_ID_FLIC, MKTAG('F', 'L', 'I', 'C')}, 127 { CODEC_ID_IDCIN, MKTAG('I', 'D', 'C', 'I')}, 128 { CODEC_ID_INTERPLAY_VIDEO, MKTAG('I', 'N', 'P', 'V')}, 129 { CODEC_ID_ROQ, MKTAG('R', 'o', 'Q', 'V')}, 130 { CODEC_ID_TIERTEXSEQVIDEO, MKTAG('T', 'S', 'E', 'Q')}, 131 { CODEC_ID_VMDVIDEO, MKTAG('V', 'M', 'D', 'V')}, 132 { CODEC_ID_WS_VQA, MKTAG('V', 'Q', 'A', 'V')}, 133 { CODEC_ID_XAN_WC3, MKTAG('W', 'C', '3', 'V')}, 120 134 { 0, 0 }, 121 135 }; … … 563 577 "supports many formats, requires libavformat", 564 578 DEMUXER_TYPE_LAVF, 565 0, // Check after other demuxer579 1, // Check after other demuxer 566 580 lavf_check_file, 567 581 demux_lavf_fill_buffer, -
TabularUnified trunk/libmpdemux/demux_mkv.c ¶
r257 r263 7 7 */ 8 8 9 9 10 #include <stdlib.h> 10 11 #include <stdio.h> 11 12 #include <ctype.h> 13 #include <inttypes.h> 12 14 13 15 #include "stream.h" … … 19 21 20 22 #include "subreader.h" 21 //#include "libvo/sub.h" 23 24 int vo_osd_changed(int new_value); 25 #define OSDTYPE_OSD 1 26 #define OSDTYPE_SUBTITLE 2 27 #define OSDTYPE_PROGBAR 3 28 #define OSDTYPE_SPU 4 29 30 extern subtitle* vo_sub; 22 31 23 32 #ifdef USE_QTX_CODECS … … 56 65 static int atrc_fl2bps[ATRC_FLAVORS] = {8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100}; 57 66 static int cook_fl2bps[COOK_FLAVORS] = {1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498, 58 4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584, 59 4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513, 60 12016, 16408, 22911, 33506}; 61 62 int vo_osd_changed(int new_value); 63 #define OSDTYPE_OSD 1 64 #define OSDTYPE_SUBTITLE 2 65 #define OSDTYPE_PROGBAR 3 66 #define OSDTYPE_SPU 4 67 68 #include "subreader.h" 69 //static subtitle ogg_sub; 70 extern subtitle* vo_sub; 71 static float clear_sub; 67 4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584, 68 4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513, 69 12016, 16408, 22911, 33506}; 72 70 73 71 typedef struct 74 72 { 75 76 77 78 73 uint32_t order, type, scope; 74 uint32_t comp_algo; 75 uint8_t *comp_settings; 76 int comp_settings_len; 79 77 } mkv_content_encoding_t; 80 78 81 79 typedef struct mkv_track 82 80 { 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 81 int tnum; 82 char *name; 83 84 char *codec_id; 85 int ms_compat; 86 char *language; 87 88 int type; 89 90 uint32_t v_width, v_height, v_dwidth, v_dheight; 91 float v_frate; 92 93 uint32_t a_formattag; 94 uint32_t a_channels, a_bps; 95 float a_sfreq; 96 97 float default_duration; 98 99 int default_track; 100 101 void *private_data; 102 unsigned int private_size; 103 104 /* stuff for realmedia */ 105 int realmedia; 106 int rv_kf_base, rv_kf_pts; 107 float rv_pts; /* previous video timestamp */ 108 float ra_pts; /* previous audio timestamp */ 109 110 /** realaudio descrambling */ 111 int sub_packet_size; ///< sub packet size, per stream 112 int sub_packet_h; ///< number of coded frames per block 113 int coded_framesize; ///< coded frame size, per stream 114 int audiopk_size; ///< audio packet size 115 unsigned char *audio_buf; ///< place to store reordered audio data 116 float *audio_timestamp; ///< timestamp for each audio packet 117 int sub_packet_cnt; ///< number of subpacket already received 118 int audio_filepos; ///< file position of first audio packet in block 119 120 /* stuff for quicktime */ 121 int fix_i_bps; 122 float qt_last_a_pts; 123 124 int subtitle_type; 125 126 /* The timecodes of video frames might have to be reordered if they're 129 127 in display order (the timecodes, not the frames themselves!). In this 130 128 case demux packets have to be cached with the help of these variables. */ 131 132 133 134 135 136 137 138 139 140 /* For VobSubs*/141 mkv_sh_sub_t sh_sub;129 int reorder_timecodes; 130 demux_packet_t **cached_dps; 131 int num_cached_dps, num_allocated_dps; 132 float max_pts; 133 134 /* generic content encoding support */ 135 mkv_content_encoding_t *encodings; 136 int num_encodings; 137 138 /* For VobSubs and SSA/ASS */ 139 sh_sub_t sh_sub; 142 140 } mkv_track_t; 143 141 144 142 typedef struct mkv_index 145 143 { 146 147 144 int tnum; 145 uint64_t timecode, filepos; 148 146 } mkv_index_t; 149 147 148 typedef struct mkv_attachment 149 { 150 char* name; 151 char* mime; 152 uint64_t uid; 153 void* data; 154 unsigned int data_size; 155 } mkv_attachment_t; 156 150 157 typedef struct mkv_demuxer 151 158 { 152 off_t segment_start; 153 154 float duration, last_pts; 155 uint64_t last_filepos; 156 157 mkv_track_t **tracks; 158 int num_tracks; 159 160 uint64_t tc_scale, cluster_tc, first_tc; 161 int has_first_tc; 162 163 uint64_t clear_subs_at[SUB_MAX_TEXT]; 164 subtitle subs; 165 166 uint64_t cluster_size; 167 uint64_t blockgroup_size; 168 169 mkv_index_t *indexes; 170 int num_indexes; 171 172 off_t *parsed_cues; 173 int parsed_cues_num; 174 off_t *parsed_seekhead; 175 int parsed_seekhead_num; 176 177 uint64_t *cluster_positions; 178 int num_cluster_pos; 179 180 int64_t skip_to_timecode; 181 int v_skip_to_keyframe, a_skip_to_keyframe; 182 183 int64_t stop_timecode; 184 185 int last_aid; 186 int audio_tracks[MAX_A_STREAMS]; 159 off_t segment_start; 160 161 float duration, last_pts; 162 uint64_t last_filepos; 163 164 mkv_track_t **tracks; 165 int num_tracks; 166 167 uint64_t tc_scale, cluster_tc, first_tc; 168 int has_first_tc; 169 170 uint64_t clear_subs_at[SUB_MAX_TEXT]; 171 subtitle subs; 172 173 uint64_t cluster_size; 174 uint64_t blockgroup_size; 175 176 mkv_index_t *indexes; 177 int num_indexes; 178 179 off_t *parsed_cues; 180 int parsed_cues_num; 181 off_t *parsed_seekhead; 182 int parsed_seekhead_num; 183 184 uint64_t *cluster_positions; 185 int num_cluster_pos; 186 187 int64_t skip_to_timecode; 188 int v_skip_to_keyframe, a_skip_to_keyframe; 189 190 int64_t stop_timecode; 191 192 int last_aid; 193 int audio_tracks[MAX_A_STREAMS]; 194 195 mkv_attachment_t *attachments; 196 int num_attachments; 187 197 } mkv_demuxer_t; 188 198 … … 190 200 typedef struct 191 201 { 192 193 194 195 202 uint32_t chunks; /* number of chunks */ 203 uint32_t timestamp; /* timestamp from packet header */ 204 uint32_t len; /* length of actual data */ 205 uint32_t chunktab; /* offset to chunk offset array */ 196 206 } dp_hdr_t; 197 207 198 208 typedef struct __attribute__((__packed__)) 199 209 { 200 201 202 203 204 205 206 207 208 209 210 uint32_t size; 211 uint32_t fourcc1; 212 uint32_t fourcc2; 213 uint16_t width; 214 uint16_t height; 215 uint16_t bpp; 216 uint32_t unknown1; 217 uint32_t fps; 218 uint32_t type1; 219 uint32_t type2; 210 220 } real_video_props_t; 211 221 212 222 typedef struct __attribute__((__packed__)) 213 223 { 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 224 uint32_t fourcc1; /* '.', 'r', 'a', 0xfd */ 225 uint16_t version1; /* 4 or 5 */ 226 uint16_t unknown1; /* 00 000 */ 227 uint32_t fourcc2; /* .ra4 or .ra5 */ 228 uint32_t unknown2; /* ??? */ 229 uint16_t version2; /* 4 or 5 */ 230 uint32_t header_size; /* == 0x4e */ 231 uint16_t flavor; /* codec flavor id */ 232 uint32_t coded_frame_size; /* coded frame size */ 233 uint32_t unknown3; /* big number */ 234 uint32_t unknown4; /* bigger number */ 235 uint32_t unknown5; /* yet another number */ 236 uint16_t sub_packet_h; 237 uint16_t frame_size; 238 uint16_t sub_packet_size; 239 uint16_t unknown6; /* 00 00 */ 240 uint16_t sample_rate; 241 uint16_t unknown8; /* 0 */ 242 uint16_t sample_size; 243 uint16_t channels; 234 244 } real_audio_v4_props_t; 235 245 236 246 typedef struct __attribute__((__packed__)) 237 247 { 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 248 uint32_t fourcc1; /* '.', 'r', 'a', 0xfd */ 249 uint16_t version1; /* 4 or 5 */ 250 uint16_t unknown1; /* 00 000 */ 251 uint32_t fourcc2; /* .ra4 or .ra5 */ 252 uint32_t unknown2; /* ??? */ 253 uint16_t version2; /* 4 or 5 */ 254 uint32_t header_size; /* == 0x4e */ 255 uint16_t flavor; /* codec flavor id */ 256 uint32_t coded_frame_size; /* coded frame size */ 257 uint32_t unknown3; /* big number */ 258 uint32_t unknown4; /* bigger number */ 259 uint32_t unknown5; /* yet another number */ 260 uint16_t sub_packet_h; 261 uint16_t frame_size; 262 uint16_t sub_packet_size; 263 uint16_t unknown6; /* 00 00 */ 264 uint8_t unknown7[6]; /* 0, srate, 0 */ 265 uint16_t sample_rate; 266 uint16_t unknown8; /* 0 */ 267 uint16_t sample_size; 268 uint16_t channels; 269 uint32_t genr; /* "genr" */ 270 uint32_t fourcc3; /* fourcc */ 261 271 } real_audio_v5_props_t; 262 272 … … 265 275 extern char *dvdsub_lang; 266 276 extern char *audio_lang; 267 //extern int dvdsub_id; 268 extern int demux_aid_vid_mismatch; 277 extern int dvdsub_id; 269 278 270 279 /** … … 275 284 */ 276 285 static void grow_array(void **array, int nelem, size_t elsize) { 277 278 286 if (!(nelem & 31)) 287 *array = realloc(*array, (nelem + 32) * elsize); 279 288 } 280 289 281 290 static mkv_track_t * 282 283 { 284 285 286 287 288 289 290 291 291 demux_mkv_find_track_by_num (mkv_demuxer_t *d, int n, int type) 292 { 293 int i, id; 294 295 for (i=0, id=0; i < d->num_tracks; i++) 296 if (d->tracks[i] != NULL && d->tracks[i]->type == type) 297 if (id++ == n) 298 return d->tracks[i]; 299 300 return NULL; 292 301 } 293 302 … … 295 304 demux_mkv_find_track_by_language (mkv_demuxer_t *d, char *language, int type) 296 305 { 297 298 299 300 301 { 302 303 304 305 306 307 308 309 } 310 311 306 int i, len; 307 308 language += strspn(language,","); 309 while((len = strcspn(language,",")) > 0) 310 { 311 for (i=0; i < d->num_tracks; i++) 312 if (d->tracks[i] != NULL && d->tracks[i]->language != NULL && 313 d->tracks[i]->type == type && 314 !strncmp(d->tracks[i]->language, language, len)) 315 return d->tracks[i]; 316 language += len; 317 language += strspn(language,","); 318 } 319 320 return NULL; 312 321 } 313 322 … … 315 324 add_cluster_position (mkv_demuxer_t *mkv_d, uint64_t position) 316 325 { 317 318 319 320 321 322 323 324 325 326 int i = mkv_d->num_cluster_pos; 327 328 while (i--) 329 if (mkv_d->cluster_positions[i] == position) 330 return; 331 332 grow_array(&mkv_d->cluster_positions, mkv_d->num_cluster_pos, 333 sizeof(uint64_t)); 334 mkv_d->cluster_positions[mkv_d->num_cluster_pos++] = position; 326 335 } 327 336 … … 331 340 aac_get_sample_rate_index (uint32_t sample_rate) 332 341 { 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 342 if (92017 <= sample_rate) 343 return 0; 344 else if (75132 <= sample_rate) 345 return 1; 346 else if (55426 <= sample_rate) 347 return 2; 348 else if (46009 <= sample_rate) 349 return 3; 350 else if (37566 <= sample_rate) 351 return 4; 352 else if (27713 <= sample_rate) 353 return 5; 354 else if (23004 <= sample_rate) 355 return 6; 356 else if (18783 <= sample_rate) 357 return 7; 358 else if (13856 <= sample_rate) 359 return 8; 360 else if (11502 <= sample_rate) 361 return 9; 362 else if (9391 <= sample_rate) 363 return 10; 364 else 365 return 11; 357 366 } 358 367 … … 361 370 vobsub_parse_size (mkv_track_t *t, const char *start) 362 371 { 363 364 { 365 366 367 368 } 369 372 if (sscanf(&start[6], "%dx%d", &t->sh_sub.width, &t->sh_sub.height) == 2) 373 { 374 dprintf("[mkv] VobSub size: %ux%u\n", 375 t->sh_sub.width, t->sh_sub.height); 376 return 1; 377 } 378 return 0; 370 379 } 371 380 … … 373 382 vobsub_parse_palette (mkv_track_t *t, const char *start) 374 383 { 375 int i, r, g, b, y, u, v, tmp; 376 377 start += 8; 378 while (isspace(*start)) 384 int i, r, g, b, y, u, v, tmp; 385 386 start += 8; 387 while (isspace(*start)) 388 start++; 389 for (i = 0; i < 16; i++) 390 { 391 if (sscanf(start, "%06x", &tmp) != 1) 392 break; 393 r = tmp >> 16 & 0xff; 394 g = tmp >> 8 & 0xff; 395 b = tmp & 0xff; 396 y = MIN(MAX((int)(0.1494 * r + 0.6061 * g + 0.2445 * b), 0), 397 0xff); 398 u = MIN(MAX((int)(0.6066 * r - 0.4322 * g - 0.1744 * b) + 128, 399 0), 0xff); 400 v = MIN(MAX((int)(-0.08435 * r - 0.3422 * g + 0.4266 * b) + 401 128, 0), 0xff); 402 t->sh_sub.palette[i] = y << 16 | u << 8 | v; 403 start += 6; 404 while ((*start == ',') || isspace(*start)) 379 405 start++; 380 for (i = 0; i < 16; i++) 381 { 382 if (sscanf(start, "%06x", &tmp) != 1) 383 break; 384 r = tmp >> 16 & 0xff; 385 g = tmp >> 8 & 0xff; 386 b = tmp & 0xff; 387 y = MIN(MAX((int)(0.1494 * r + 0.6061 * g + 0.2445 * b), 0), 388 0xff); 389 u = MIN(MAX((int)(0.6066 * r - 0.4322 * g - 0.1744 * b) + 128, 390 0), 0xff); 391 v = MIN(MAX((int)(-0.08435 * r - 0.3422 * g + 0.4266 * b) + 392 128, 0), 0xff); 393 t->sh_sub.palette[i] = y << 16 | u << 8 | v; 394 start += 6; 395 while ((*start == ',') || isspace(*start)) 396 start++; 397 } 398 if (i == 16) 399 { 400 dprintf("[mkv] VobSub palette: %06x,%06x," 401 "%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x," 402 "%06x,%06x,%06x\n", t->sh_sub.palette[0], 403 t->sh_sub.palette[1], t->sh_sub.palette[2], 404 t->sh_sub.palette[3], t->sh_sub.palette[4], 405 t->sh_sub.palette[5], t->sh_sub.palette[6], 406 t->sh_sub.palette[7], t->sh_sub.palette[8], 407 t->sh_sub.palette[9], t->sh_sub.palette[10], 408 t->sh_sub.palette[11], t->sh_sub.palette[12], 409 t->sh_sub.palette[13], t->sh_sub.palette[14], 410 t->sh_sub.palette[15]); 411 t->sh_sub.has_palette = 1; 412 return 2; 413 } 414 return 0; 406 } 407 if (i == 16) 408 { 409 dprintf("[mkv] VobSub palette: %06x,%06x," 410 "%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x,%06x," 411 "%06x,%06x,%06x\n", t->sh_sub.palette[0], 412 t->sh_sub.palette[1], t->sh_sub.palette[2], 413 t->sh_sub.palette[3], t->sh_sub.palette[4], 414 t->sh_sub.palette[5], t->sh_sub.palette[6], 415 t->sh_sub.palette[7], t->sh_sub.palette[8], 416 t->sh_sub.palette[9], t->sh_sub.palette[10], 417 t->sh_sub.palette[11], t->sh_sub.palette[12], 418 t->sh_sub.palette[13], t->sh_sub.palette[14], 419 t->sh_sub.palette[15]); 420 t->sh_sub.has_palette = 1; 421 return 2; 422 } 423 return 0; 415 424 } 416 425 … … 418 427 vobsub_parse_custom_colors (mkv_track_t *t, const char *start) 419 428 { 420 421 422 423 424 425 426 427 428 429 430 431 432 433 {434 435 436 437 438 {439 440 441 442 443 444 }445 446 {447 448 449 450 451 452 }453 }454 455 456 429 int use_custom_colors, i; 430 431 use_custom_colors = 0; 432 start += 14; 433 while (isspace(*start)) 434 start++; 435 if (!strncasecmp(start, "ON", 2) || (*start == '1')) 436 use_custom_colors = 1; 437 else if (!strncasecmp(start, "OFF", 3) || (*start == '0')) 438 use_custom_colors = 0; 439 dprintf("[mkv] VobSub custom colors: %s\n", 440 use_custom_colors ? "ON" : "OFF"); 441 if ((start = strstr(start, "colors:")) != NULL) 442 { 443 start += 7; 444 while (isspace(*start)) 445 start++; 446 for (i = 0; i < 4; i++) 447 { 448 if (sscanf(start, "%06x", &t->sh_sub.colors[i]) != 1) 449 break; 450 start += 6; 451 while ((*start == ',') || isspace(*start)) 452 start++; 453 } 454 if (i == 4) 455 { 456 t->sh_sub.custom_colors = 4; 457 dprintf("[mkv] VobSub colors: %06x," 458 "%06x,%06x,%06x\n", t->sh_sub.colors[0], 459 t->sh_sub.colors[1], t->sh_sub.colors[2], 460 t->sh_sub.colors[3]); 461 } 462 } 463 if (!use_custom_colors) 464 t->sh_sub.custom_colors = 0; 465 return 4; 457 466 } 458 467 … … 460 469 vobsub_parse_forced_subs (mkv_track_t *t, const char *start) 461 470 { 462 463 464 465 466 467 468 469 470 471 472 473 471 start += 12; 472 while (isspace(*start)) 473 start++; 474 if (!strncasecmp(start, "on", 2) || (*start == '1')) 475 t->sh_sub.forced_subs_only = 1; 476 else if (!strncasecmp(start, "off", 3) || (*start == '0')) 477 t->sh_sub.forced_subs_only = 0; 478 else 479 return 0; 480 dprintf("[mkv] VobSub forced subs: %d\n", 481 t->sh_sub.forced_subs_only); 482 return 8; 474 483 } 475 484 … … 485 494 free_cached_dps (demuxer_t *demuxer) 486 495 { 487 488 489 490 491 492 { 493 494 495 496 497 498 499 500 496 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 497 mkv_track_t *track; 498 int i, k; 499 500 for (k = 0; k < mkv_d->num_tracks; k++) 501 { 502 track = mkv_d->tracks[k]; 503 for (i = 0; i < track->num_cached_dps; i++) 504 free_demux_packet (track->cached_dps[i]); 505 free(track->cached_dps); 506 track->cached_dps = NULL; 507 track->num_cached_dps = 0; 508 track->num_allocated_dps = 0; 509 track->max_pts = 0; 501 510 } 502 511 } … … 505 514 demux_mkv_parse_idx (mkv_track_t *t) 506 515 { 507 508 509 510 511 512 513 514 buf = (char *)malloc(t->private_size + 1);515 516 517 518 519 520 521 522 523 524 525 526 { 527 528 { 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 516 int things_found, last; 517 char *buf, *pos, *start; 518 519 if ((t->private_data == NULL) || (t->private_size == 0)) 520 return 0; 521 522 things_found = 0; 523 buf = malloc(t->private_size + 1); 524 if (buf == NULL) 525 return 0; 526 memcpy(buf, t->private_data, t->private_size); 527 buf[t->private_size] = 0; 528 t->sh_sub.type = 'v'; 529 t->sh_sub.has_palette = 0; 530 531 pos = buf; 532 start = buf; 533 last = 0; 534 do 535 { 536 if ((*pos == 0) || (*pos == '\r') || (*pos == '\n')) 537 { 538 if (*pos == 0) 539 last = 1; 540 *pos = 0; 541 542 if (!strncasecmp(start, "size: ", 6)) 543 things_found |= vobsub_parse_size(t, start); 544 else if (!strncasecmp(start, "palette:", 8)) 545 things_found |= vobsub_parse_palette(t, start); 546 else if (!strncasecmp(start, "custom colors:", 14)) 547 things_found |= vobsub_parse_custom_colors(t, start); 548 else if (!strncasecmp(start, "forced subs:", 12)) 549 things_found |= vobsub_parse_forced_subs(t, start); 550 551 if (last) 552 break; 553 do 545 554 { 546 555 pos++; 547 556 } 548 549 550 } 551 552 553 } 554 555 556 557 558 557 while ((*pos == '\r') || (*pos == '\n')); 558 start = pos; 559 } 560 else 561 pos++; 562 } 563 while (!last && (*start != 0)); 564 565 free(buf); 566 567 return (things_found & 3) == 3; 559 568 } 560 569 … … 564 573 uint32_t *size, uint32_t type) 565 574 { 566 567 568 569 570 571 572 573 574 { 575 576 575 int i, result; 576 int modified = 0; 577 578 *dest = src; 579 if (track->num_encodings <= 0) 580 return 0; 581 582 for (i=0; i<track->num_encodings; i++) 583 { 584 if (!(track->encodings[i].scope & type)) 585 continue; 577 586 578 587 #ifdef HAVE_ZLIB 579 580 { 581 582 583 584 585 586 587 588 if (track->encodings[i].comp_algo == 0) 589 { 590 /* zlib encoded track */ 591 z_stream zstream; 592 593 zstream.zalloc = (alloc_func) 0; 594 zstream.zfree = (free_func) 0; 595 zstream.opaque = (voidpf) 0; 596 if (inflateInit (&zstream) != Z_OK) 588 597 { 589 dprintf ( 590 "[mkv] zlib initialization failed.\n"); 598 dprintf( 599 MSGTR_MPDEMUX_MKV_ZlibInitializationFailed); 600 return modified; 601 } 602 zstream.next_in = (Bytef *) src; 603 zstream.avail_in = *size; 604 605 modified = 1; 606 *dest = malloc (*size); 607 zstream.avail_out = *size; 608 do { 609 *size += 4000; 610 *dest = realloc (*dest, *size); 611 zstream.next_out = (Bytef *) (*dest + zstream.total_out); 612 result = inflate (&zstream, Z_NO_FLUSH); 613 if (result != Z_OK && result != Z_STREAM_END) 614 { 615 dprintf( 616 MSGTR_MPDEMUX_MKV_ZlibDecompressionFailed); 617 free(*dest); 618 *dest = NULL; 619 inflateEnd (&zstream); 591 620 return modified; 621 } 622 zstream.avail_out += 4000; 623 } while (zstream.avail_out == 4000 && 624 zstream.avail_in != 0 && result != Z_STREAM_END); 625 626 *size = zstream.total_out; 627 inflateEnd (&zstream); 628 } 629 #endif 630 if (track->encodings[i].comp_algo == 2) 631 { 632 /* lzo encoded track */ 633 int dstlen = *size * 3; 634 635 if (lzo_init () != LZO_E_OK) 636 { 637 dprintf( 638 MSGTR_MPDEMUX_MKV_LzoInitializationFailed); 639 return modified; 592 640 } 593 zstream.next_in = (Bytef *) src; 594 zstream.avail_in = *size; 595 596 modified = 1; 597 *dest = (uint8_t *) malloc (*size); 598 zstream.avail_out = *size; 599 do { 600 *size += 4000; 601 *dest = (uint8_t *) realloc (*dest, *size); 602 zstream.next_out = (Bytef *) (*dest + zstream.total_out); 603 result = inflate (&zstream, Z_NO_FLUSH); 604 if (result != Z_OK && result != Z_STREAM_END) 641 642 *dest = malloc (dstlen); 643 while (1) 644 { 645 result = lzo1x_decompress_safe (src, *size, *dest, &dstlen, 646 NULL); 647 if (result == LZO_E_OK) 648 break; 649 if (result != LZO_E_OUTPUT_OVERRUN) 605 650 { 606 dprintf ( 607 "[mkv] zlib decompression failed.\n"); 608 free(*dest); 609 *dest = NULL; 610 inflateEnd (&zstream); 611 return modified; 651 dprintf( 652 MSGTR_MPDEMUX_MKV_LzoDecompressionFailed); 653 return modified; 612 654 } 613 zstream.avail_out += 4000; 614 } while (zstream.avail_out == 4000 && 615 zstream.avail_in != 0 && result != Z_STREAM_END); 616 617 *size = zstream.total_out; 618 inflateEnd (&zstream); 619 } 620 #endif 621 if (track->encodings[i].comp_algo == 2) 622 { 623 /* lzo encoded track */ 624 int dstlen = *size * 3; 625 626 if (lzo_init () != LZO_E_OK) 627 { 628 dprintf ( 629 "[mkv] lzo initialization failed.\n"); 630 return modified; 655 dprintf("[mkv] lzo decompression buffer too small.\n"); 656 dstlen *= 2; 657 *dest = realloc (*dest, dstlen); 631 658 } 632 633 *dest = (uint8_t *) malloc (dstlen); 634 while (1) 635 { 636 result = lzo1x_decompress_safe (src, *size, *dest, &dstlen, 637 NULL); 638 if (result == LZO_E_OK) 639 break; 640 if (result != LZO_E_OUTPUT_OVERRUN) 641 { 642 dprintf ( 643 "[mkv] lzo decompression failed.\n"); 644 return modified; 645 } 646 dprintf ( 647 "[mkv] lzo decompression buffer too small.\n"); 648 dstlen *= 2; 649 *dest = (uint8_t *) realloc (*dest, dstlen); 650 } 651 *size = dstlen; 652 } 653 } 654 655 return modified; 659 *size = dstlen; 660 } 661 } 662 663 return modified; 656 664 } 657 665 … … 660 668 demux_mkv_read_info (demuxer_t *demuxer) 661 669 { 662 663 664 665 666 667 668 669 670 671 { 672 670 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 671 stream_t *s = demuxer->stream; 672 uint64_t length, l; 673 int il; 674 uint64_t tc_scale = 1000000; 675 long double duration = 0.; 676 677 length = ebml_read_length (s, NULL); 678 while (length > 0) 679 { 680 switch (ebml_read_id (s, &il)) 673 681 { 674 682 case MATROSKA_ID_TIMECODESCALE: 675 676 677 678 679 680 dprintf("[mkv] | + timecode scale: %"PRIu64"\n",681 682 683 683 { 684 uint64_t num = ebml_read_uint (s, &l); 685 if (num == EBML_UINT_INVALID) 686 return 1; 687 tc_scale = num; 688 dprintf("[mkv] | + timecode scale: %"PRIu64"\n", 689 tc_scale); 690 break; 691 } 684 692 685 693 case MATROSKA_ID_DURATION: 686 687 688 689 690 691 692 693 694 694 { 695 long double num = ebml_read_float (s, &l); 696 if (num == EBML_FLOAT_INVALID) 697 return 1; 698 duration = num; 699 dprintf("[mkv] | + duration: %.3Lfs\n", 700 duration * tc_scale / 1000000000.0); 701 break; 702 } 695 703 696 704 default: 697 ebml_read_skip (s, &l);698 699 } 700 701 } 702 703 704 705 ebml_read_skip (s, &l); 706 break; 707 } 708 length -= l + il; 709 } 710 mkv_d->tc_scale = tc_scale; 711 mkv_d->duration = duration * tc_scale / 1000000000.0; 712 return 0; 705 713 } 706 714 … … 713 721 demux_mkv_free_encodings(mkv_content_encoding_t *encodings, int numencodings) 714 722 { 715 716 717 723 while (numencodings-- > 0) 724 free(encodings[numencodings].comp_settings); 725 free(encodings); 718 726 } 719 727 … … 721 729 demux_mkv_read_trackencodings (demuxer_t *demuxer, mkv_track_t *track) 722 730 { 723 724 725 726 727 728 ce = (mkv_content_encoding_t *)malloc (sizeof (*ce));729 730 731 732 733 734 { 735 731 stream_t *s = demuxer->stream; 732 mkv_content_encoding_t *ce, e; 733 uint64_t len, length, l; 734 int il, n; 735 736 ce = malloc (sizeof (*ce)); 737 n = 0; 738 739 len = length = ebml_read_length (s, &il); 740 len += il; 741 while (length > 0) 742 { 743 switch (ebml_read_id (s, &il)) 736 744 { 737 745 case MATROSKA_ID_CONTENTENCODING: 738 { 739 uint64_t len; 740 int i; 741 742 memset (&e, 0, sizeof (e)); 743 e.scope = 1; 744 745 len = ebml_read_length (s, &i); 746 l = len + i; 747 748 while (len > 0) 749 { 750 uint64_t num, l; 751 int il; 752 753 switch (ebml_read_id (s, &il)) 746 { 747 uint64_t len; 748 int i; 749 750 memset (&e, 0, sizeof (e)); 751 e.scope = 1; 752 753 len = ebml_read_length (s, &i); 754 l = len + i; 755 756 while (len > 0) 757 { 758 uint64_t num, l; 759 int il; 760 761 switch (ebml_read_id (s, &il)) 762 { 763 case MATROSKA_ID_CONTENTENCODINGORDER: 764 num = ebml_read_uint (s, &l); 765 if (num == EBML_UINT_INVALID) 766 goto err_out; 767 e.order = num; 768 break; 769 770 case MATROSKA_ID_CONTENTENCODINGSCOPE: 771 num = ebml_read_uint (s, &l); 772 if (num == EBML_UINT_INVALID) 773 goto err_out; 774 e.scope = num; 775 break; 776 777 case MATROSKA_ID_CONTENTENCODINGTYPE: 778 num = ebml_read_uint (s, &l); 779 if (num == EBML_UINT_INVALID) 780 goto err_out; 781 e.type = num; 782 break; 783 784 case MATROSKA_ID_CONTENTCOMPRESSION: 754 785 { 755 case MATROSKA_ID_CONTENTENCODINGORDER: 756 num = ebml_read_uint (s, &l); 757 if (num == EBML_UINT_INVALID) 758 goto err_out; 759 e.order = num; 760 break; 761 762 case MATROSKA_ID_CONTENTENCODINGSCOPE: 763 num = ebml_read_uint (s, &l); 764 if (num == EBML_UINT_INVALID) 765 goto err_out; 766 e.scope = num; 767 break; 768 769 case MATROSKA_ID_CONTENTENCODINGTYPE: 770 num = ebml_read_uint (s, &l); 771 if (num == EBML_UINT_INVALID) 772 goto err_out; 773 e.type = num; 774 break; 775 776 case MATROSKA_ID_CONTENTCOMPRESSION: 786 uint64_t le; 787 788 le = ebml_read_length (s, &i); 789 l = le + i; 790 791 while (le > 0) 777 792 { 778 uint64_t le; 779 780 le = ebml_read_length (s, &i); 781 l = le + i; 782 783 while (le > 0) 793 uint64_t l; 794 int il; 795 796 switch (ebml_read_id (s, &il)) 784 797 { 785 uint64_t l; 786 int il; 787 788 switch (ebml_read_id (s, &il)) 789 { 790 case MATROSKA_ID_CONTENTCOMPALGO: 791 num = ebml_read_uint (s, &l); 792 if (num == EBML_UINT_INVALID) 793 goto err_out; 794 e.comp_algo = num; 795 break; 796 797 case MATROSKA_ID_CONTENTCOMPSETTINGS: 798 l = ebml_read_length (s, &i); 799 e.comp_settings = (uint8_t *) malloc (l); 800 stream_read (s, e.comp_settings, l); 801 e.comp_settings_len = l; 802 l += i; 803 break; 804 805 default: 806 ebml_read_skip (s, &l); 807 break; 808 } 809 le -= l + il; 798 case MATROSKA_ID_CONTENTCOMPALGO: 799 num = ebml_read_uint (s, &l); 800 if (num == EBML_UINT_INVALID) 801 goto err_out; 802 e.comp_algo = num; 803 break; 804 805 case MATROSKA_ID_CONTENTCOMPSETTINGS: 806 l = ebml_read_length (s, &i); 807 e.comp_settings = malloc (l); 808 stream_read (s, e.comp_settings, l); 809 e.comp_settings_len = l; 810 l += i; 811 break; 812 813 default: 814 ebml_read_skip (s, &l); 815 break; 810 816 } 811 812 if (e.type == 1) 813 { 814 dprintf( 815 "[mkv] Track number %u has been encrypted " 816 "and decryption has not yet been implemented." 817 " Skipping track.\n", track->tnum); 818 } 819 else if (e.type != 0) 820 { 821 dprintf( 822 "[mkv] Unknown content encoding type for " 823 "track %u. Skipping track.\n", track->tnum); 824 } 825 826 if (e.comp_algo != 0 && e.comp_algo != 2) 827 { 828 dprintf ( 829 "[mkv] Track %u has been compressed with an " 830 "unknown/unsupported compression algorithm " 831 "(%u). Skipping track.\n", 832 track->tnum, e.comp_algo); 833 } 817 le -= l + il; 818 } 819 820 if (e.type == 1) 821 { 822 dprintf( 823 MSGTR_MPDEMUX_MKV_TrackEncrypted, track->tnum); 824 } 825 else if (e.type != 0) 826 { 827 dprintf( 828 MSGTR_MPDEMUX_MKV_UnknownContentEncoding, track->tnum); 829 } 830 831 if (e.comp_algo != 0 && e.comp_algo != 2) 832 { 833 dprintf( 834 MSGTR_MPDEMUX_MKV_UnknownCompression, 835 track->tnum, e.comp_algo); 836 } 834 837 #ifndef HAVE_ZLIB 835 else if (e.comp_algo == 0) 836 { 837 dprintf ( 838 "Track %u was compressed with zlib but " 839 "mplayer has not been compiled with support " 840 "for zlib compression. Skipping track.\n", 841 track->tnum); 842 } 838 else if (e.comp_algo == 0) 839 { 840 dprintf( 841 MSGTR_MPDEMUX_MKV_ZlibCompressionUnsupported, 842 track->tnum); 843 } 843 844 #endif 844 845 845 break; 846 } 847 848 default: 849 ebml_read_skip (s, &l); 850 break; 846 break; 851 847 } 852 len -= l + il; 853 }854 for (i=0; i<n; i++)855 if (e.order <= ce[i].order)856 break;857 ce = (mkv_content_encoding_t *) realloc (ce, (n+1) *sizeof (*ce));858 memmove (ce+i+1, ce+i, (n-i) * sizeof (*ce));859 memcpy (ce+i, &e, sizeof (e));860 n++;848 849 default: 850 ebml_read_skip (s, &l); 851 break; 852 } 853 len -= l + il; 854 } 855 for (i=0; i<n; i++) 856 if (e.order <= ce[i].order) 861 857 break; 862 } 858 ce = realloc (ce, (n+1) *sizeof (*ce)); 859 memmove (ce+i+1, ce+i, (n-i) * sizeof (*ce)); 860 memcpy (ce+i, &e, sizeof (e)); 861 n++; 862 break; 863 } 864 865 default: 866 ebml_read_skip (s, &l); 867 break; 868 } 869 870 length -= l + il; 871 } 872 873 track->encodings = ce; 874 track->num_encodings = n; 875 return len; 876 877 err_out: 878 demux_mkv_free_encodings(ce, n); 879 return 0; 880 } 881 882 static int 883 demux_mkv_read_trackaudio (demuxer_t *demuxer, mkv_track_t *track) 884 { 885 stream_t *s = demuxer->stream; 886 uint64_t len, length, l; 887 int il; 888 889 track->a_sfreq = 8000.0; 890 track->a_channels = 1; 891 892 len = length = ebml_read_length (s, &il); 893 len += il; 894 while (length > 0) 895 { 896 switch (ebml_read_id (s, &il)) 897 { 898 case MATROSKA_ID_AUDIOSAMPLINGFREQ: 899 { 900 long double num = ebml_read_float (s, &l); 901 if (num == EBML_FLOAT_INVALID) 902 return 0; 903 track->a_sfreq = num; 904 dprintf("[mkv] | + Sampling frequency: %f\n", 905 track->a_sfreq); 906 break; 907 } 908 909 case MATROSKA_ID_AUDIOBITDEPTH: 910 { 911 uint64_t num = ebml_read_uint (s, &l); 912 if (num == EBML_UINT_INVALID) 913 return 0; 914 track->a_bps = num; 915 dprintf("[mkv] | + Bit depth: %u\n", 916 track->a_bps); 917 break; 918 } 919 920 case MATROSKA_ID_AUDIOCHANNELS: 921 { 922 uint64_t num = ebml_read_uint (s, &l); 923 if (num == EBML_UINT_INVALID) 924 return 0; 925 track->a_channels = num; 926 dprintf("[mkv] | + Channels: %u\n", 927 track->a_channels); 928 break; 929 } 863 930 864 931 default: … … 866 933 break; 867 934 } 868 869 length -= l + il; 870 } 871 872 track->encodings = ce; 873 track->num_encodings = n; 874 return len; 875 876 err_out: 877 demux_mkv_free_encodings(ce, n); 878 return 0; 935 length -= l + il; 936 } 937 return len; 879 938 } 880 939 881 940 static int 882 demux_mkv_read_trackaudio (demuxer_t *demuxer, mkv_track_t *track) 883 { 884 stream_t *s = demuxer->stream; 885 uint64_t len, length, l; 886 int il; 887 888 track->a_sfreq = 8000.0; 889 track->a_channels = 1; 890 891 len = length = ebml_read_length (s, &il); 892 len += il; 893 while (length > 0) 894 { 895 switch (ebml_read_id (s, &il)) 896 { 897 case MATROSKA_ID_AUDIOSAMPLINGFREQ: 898 { 899 long double num = ebml_read_float (s, &l); 900 if (num == EBML_FLOAT_INVALID) 901 return 0; 902 track->a_sfreq = num; 903 dprintf ("[mkv] | + Sampling frequency: %f\n", 904 track->a_sfreq); 905 break; 906 } 907 908 case MATROSKA_ID_AUDIOBITDEPTH: 909 { 910 uint64_t num = ebml_read_uint (s, &l); 911 if (num == EBML_UINT_INVALID) 912 return 0; 913 track->a_bps = num; 914 dprintf ("[mkv] | + Bit depth: %u\n", 915 track->a_bps); 916 break; 917 } 918 919 case MATROSKA_ID_AUDIOCHANNELS: 920 { 921 uint64_t num = ebml_read_uint (s, &l); 922 if (num == EBML_UINT_INVALID) 923 return 0; 924 track->a_channels = num; 925 dprintf ("[mkv] | + Channels: %u\n", 926 track->a_channels); 927 break; 928 } 941 demux_mkv_read_trackvideo (demuxer_t *demuxer, mkv_track_t *track) 942 { 943 stream_t *s = demuxer->stream; 944 uint64_t len, length, l; 945 int il; 946 947 len = length = ebml_read_length (s, &il); 948 len += il; 949 while (length > 0) 950 { 951 switch (ebml_read_id (s, &il)) 952 { 953 case MATROSKA_ID_VIDEOFRAMERATE: 954 { 955 long double num = ebml_read_float (s, &l); 956 if (num == EBML_FLOAT_INVALID) 957 return 0; 958 track->v_frate = num; 959 dprintf("[mkv] | + Frame rate: %f\n", 960 track->v_frate); 961 if (track->v_frate > 0) 962 track->default_duration = 1 / track->v_frate; 963 break; 964 } 965 966 case MATROSKA_ID_VIDEODISPLAYWIDTH: 967 { 968 uint64_t num = ebml_read_uint (s, &l); 969 if (num == EBML_UINT_INVALID) 970 return 0; 971 track->v_dwidth = num; 972 dprintf("[mkv] | + Display width: %u\n", 973 track->v_dwidth); 974 break; 975 } 976 977 case MATROSKA_ID_VIDEODISPLAYHEIGHT: 978 { 979 uint64_t num = ebml_read_uint (s, &l); 980 if (num == EBML_UINT_INVALID) 981 return 0; 982 track->v_dheight = num; 983 dprintf("[mkv] | + Display height: %u\n", 984 track->v_dheight); 985 break; 986 } 987 988 case MATROSKA_ID_VIDEOPIXELWIDTH: 989 { 990 uint64_t num = ebml_read_uint (s, &l); 991 if (num == EBML_UINT_INVALID) 992 return 0; 993 track->v_width = num; 994 dprintf("[mkv] | + Pixel width: %u\n", 995 track->v_width); 996 break; 997 } 998 999 case MATROSKA_ID_VIDEOPIXELHEIGHT: 1000 { 1001 uint64_t num = ebml_read_uint (s, &l); 1002 if (num == EBML_UINT_INVALID) 1003 return 0; 1004 track->v_height = num; 1005 dprintf("[mkv] | + Pixel height: %u\n", 1006 track->v_height); 1007 break; 1008 } 929 1009 930 1010 default: … … 932 1012 break; 933 1013 } 934 length -= l + il; 935 } 936 return len; 937 } 938 939 static int 940 demux_mkv_read_trackvideo (demuxer_t *demuxer, mkv_track_t *track) 941 { 942 stream_t *s = demuxer->stream; 943 uint64_t len, length, l; 944 int il; 945 946 len = length = ebml_read_length (s, &il); 947 len += il; 948 while (length > 0) 949 { 950 switch (ebml_read_id (s, &il)) 951 { 952 case MATROSKA_ID_VIDEOFRAMERATE: 953 { 954 long double num = ebml_read_float (s, &l); 955 if (num == EBML_FLOAT_INVALID) 956 return 0; 957 track->v_frate = num; 958 dprintf ("[mkv] | + Frame rate: %f\n", 959 track->v_frate); 960 if (track->v_frate > 0) 961 track->default_duration = 1 / track->v_frate; 962 break; 963 } 964 965 case MATROSKA_ID_VIDEODISPLAYWIDTH: 966 { 967 uint64_t num = ebml_read_uint (s, &l); 968 if (num == EBML_UINT_INVALID) 969 return 0; 970 track->v_dwidth = num; 971 dprintf ("[mkv] | + Display width: %u\n", 972 track->v_dwidth); 973 break; 974 } 975 976 case MATROSKA_ID_VIDEODISPLAYHEIGHT: 977 { 978 uint64_t num = ebml_read_uint (s, &l); 979 if (num == EBML_UINT_INVALID) 980 return 0; 981 track->v_dheight = num; 982 dprintf ("[mkv] | + Display height: %u\n", 983 track->v_dheight); 984 break; 985 } 986 987 case MATROSKA_ID_VIDEOPIXELWIDTH: 988 { 989 uint64_t num = ebml_read_uint (s, &l); 990 if (num == EBML_UINT_INVALID) 991 return 0; 992 track->v_width = num; 993 dprintf ("[mkv] | + Pixel width: %u\n", 994 track->v_width); 995 break; 996 } 997 998 case MATROSKA_ID_VIDEOPIXELHEIGHT: 999 { 1000 uint64_t num = ebml_read_uint (s, &l); 1001 if (num == EBML_UINT_INVALID) 1002 return 0; 1003 track->v_height = num; 1004 dprintf ("[mkv] | + Pixel height: %u\n", 1005 track->v_height); 1006 break; 1007 } 1008 1009 default: 1010 ebml_read_skip (s, &l); 1011 break; 1012 } 1013 length -= l + il; 1014 } 1015 return len; 1014 length -= l + il; 1015 } 1016 return len; 1016 1017 } 1017 1018 … … 1022 1023 static void 1023 1024 demux_mkv_free_trackentry(mkv_track_t *track) { 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1025 if (track->name) 1026 free (track->name); 1027 if (track->codec_id) 1028 free (track->codec_id); 1029 if (track->language) 1030 free (track->language); 1031 if (track->private_data) 1032 free (track->private_data); 1033 if (track->audio_buf) 1034 free (track->audio_buf); 1035 if (track->audio_timestamp) 1036 free (track->audio_timestamp); 1036 1037 #ifdef USE_ASS 1037 1038 1038 if (track->sh_sub.ass_track) 1039 ass_free_track (track->sh_sub.ass_track); 1039 1040 #endif 1040 1041 1041 demux_mkv_free_encodings(track->encodings, track->num_encodings); 1042 free(track); 1042 1043 } 1043 1044 … … 1045 1046 demux_mkv_read_trackentry (demuxer_t *demuxer) 1046 1047 { 1047 1048 1049 1050 1051 1052 1053 track = (mkv_track_t *) malloc (sizeof (*track));1054 memset(track, 0, sizeof(*track));1055 /* set default values */1056 track->default_track = 1;1057 1058 1059 1060 1061 1062 { 1063 1048 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1049 stream_t *s = demuxer->stream; 1050 mkv_track_t *track; 1051 uint64_t len, length, l; 1052 int il; 1053 1054 track = calloc (1, sizeof (*track)); 1055 /* set default values */ 1056 track->default_track = 1; 1057 track->name = 0; 1058 track->language = strdup("eng"); 1059 1060 len = length = ebml_read_length (s, &il); 1061 len += il; 1062 while (length > 0) 1063 { 1064 switch (ebml_read_id (s, &il)) 1064 1065 { 1065 1066 case MATROSKA_ID_TRACKNUMBER: 1066 { 1067 uint64_t num = ebml_read_uint (s, &l); 1068 if (num == EBML_UINT_INVALID) 1069 goto err_out; 1070 track->tnum = num; 1071 dprintf ("[mkv] | + Track number: %u\n", 1072 track->tnum); 1067 { 1068 uint64_t num = ebml_read_uint (s, &l); 1069 if (num == EBML_UINT_INVALID) 1070 goto err_out; 1071 track->tnum = num; 1072 dprintf("[mkv] | + Track number: %u\n", 1073 track->tnum); 1074 break; 1075 } 1076 1077 case MATROSKA_ID_TRACKNAME: 1078 { 1079 track->name = ebml_read_utf8 (s, &l); 1080 if (track->name == NULL) 1081 goto err_out; 1082 dprintf("[mkv] | + Name: %s\n", 1083 track->name); 1084 break; 1085 } 1086 1087 case MATROSKA_ID_TRACKTYPE: 1088 { 1089 uint64_t num = ebml_read_uint (s, &l); 1090 if (num == EBML_UINT_INVALID) 1091 return 0; 1092 track->type = num; 1093 dprintf("[mkv] | + Track type: "); 1094 switch (track->type) 1095 { 1096 case MATROSKA_TRACK_AUDIO: 1097 dprintf("Audio\n"); 1098 break; 1099 case MATROSKA_TRACK_VIDEO: 1100 dprintf("Video\n"); 1101 break; 1102 case MATROSKA_TRACK_SUBTITLE: 1103 dprintf("Subtitle\n"); 1104 break; 1105 default: 1106 dprintf("unknown\n"); 1073 1107 break; 1074 1108 } 1075 1076 case MATROSKA_ID_TRACKTYPE: 1109 break; 1110 } 1111 1112 case MATROSKA_ID_TRACKAUDIO: 1113 dprintf("[mkv] | + Audio track\n"); 1114 l = demux_mkv_read_trackaudio (demuxer, track); 1115 if (l == 0) 1116 goto err_out; 1117 break; 1118 1119 case MATROSKA_ID_TRACKVIDEO: 1120 dprintf("[mkv] | + Video track\n"); 1121 l = demux_mkv_read_trackvideo (demuxer, track); 1122 if (l == 0) 1123 goto err_out; 1124 break; 1125 1126 case MATROSKA_ID_CODECID: 1127 track->codec_id = ebml_read_ascii (s, &l); 1128 if (track->codec_id == NULL) 1129 goto err_out; 1130 if (!strcmp (track->codec_id, MKV_V_MSCOMP) || 1131 !strcmp (track->codec_id, MKV_A_ACM)) 1132 track->ms_compat = 1; 1133 else if (!strcmp (track->codec_id, MKV_S_VOBSUB)) 1134 track->subtitle_type = MATROSKA_SUBTYPE_VOBSUB; 1135 else if (!strcmp (track->codec_id, MKV_S_TEXTSSA) 1136 || !strcmp (track->codec_id, MKV_S_TEXTASS) 1137 || !strcmp (track->codec_id, MKV_S_SSA) 1138 || !strcmp (track->codec_id, MKV_S_ASS)) 1077 1139 { 1078 uint64_t num = ebml_read_uint (s, &l); 1079 if (num == EBML_UINT_INVALID) 1080 return 0; 1081 track->type = num; 1082 dprintf ("[mkv] | + Track type: "); 1083 switch (track->type) 1084 { 1085 case MATROSKA_TRACK_AUDIO: 1086 dprintf ("Audio\n"); 1087 break; 1088 case MATROSKA_TRACK_VIDEO: 1089 dprintf ("Video\n"); 1090 break; 1091 case MATROSKA_TRACK_SUBTITLE: 1092 dprintf ("Subtitle\n"); 1093 break; 1094 default: 1095 dprintf ("unknown\n"); 1096 break; 1097 } 1098 break; 1140 track->subtitle_type = MATROSKA_SUBTYPE_SSA; 1099 1141 } 1100 1101 case MATROSKA_ID_TRACKAUDIO: 1102 dprintf ("[mkv] | + Audio track\n"); 1103 l = demux_mkv_read_trackaudio (demuxer, track); 1104 if (l == 0) 1105 goto err_out; 1142 else if (!strcmp (track->codec_id, MKV_S_TEXTASCII)) 1143 track->subtitle_type = MATROSKA_SUBTYPE_TEXT; 1144 if (!strcmp (track->codec_id, MKV_S_TEXTUTF8)) 1145 { 1146 track->subtitle_type = MATROSKA_SUBTYPE_TEXT; 1147 } 1148 dprintf("[mkv] | + Codec ID: %s\n", 1149 track->codec_id); 1150 break; 1151 1152 case MATROSKA_ID_CODECPRIVATE: 1153 { 1154 int x; 1155 uint64_t num = ebml_read_length (s, &x); 1156 // audit: cheap guard against overflows later.. 1157 if (num > SIZE_MAX - 1000) return 0; 1158 l = x + num; 1159 track->private_data = malloc (num); 1160 if (stream_read(s, track->private_data, num) != (int) num) 1161 goto err_out; 1162 track->private_size = num; 1163 dprintf("[mkv] | + CodecPrivate, length " 1164 "%u\n", track->private_size); 1106 1165 break; 1107 1108 case MATROSKA_ID_TRACKVIDEO: 1109 dprintf ("[mkv] | + Video track\n"); 1110 l = demux_mkv_read_trackvideo (demuxer, track); 1111 if (l == 0) 1112 goto err_out; 1166 } 1167 1168 case MATROSKA_ID_TRACKLANGUAGE: 1169 free(track->language); 1170 track->language = ebml_read_utf8 (s, &l); 1171 if (track->language == NULL) 1172 goto err_out; 1173 dprintf("[mkv] | + Language: %s\n", 1174 track->language); 1175 break; 1176 1177 case MATROSKA_ID_TRACKFLAGDEFAULT: 1178 { 1179 uint64_t num = ebml_read_uint (s, &l); 1180 if (num == EBML_UINT_INVALID) 1181 goto err_out; 1182 track->default_track = num; 1183 dprintf("[mkv] | + Default flag: %u\n", 1184 track->default_track); 1113 1185 break; 1114 1115 case MATROSKA_ID_CODECID: 1116 track->codec_id = ebml_read_ascii (s, &l); 1117 if (track->codec_id == NULL) 1118 goto err_out; 1119 if (!strcmp (track->codec_id, MKV_V_MSCOMP) || 1120 !strcmp (track->codec_id, MKV_A_ACM)) 1121 track->ms_compat = 1; 1122 else if (!strcmp (track->codec_id, MKV_S_VOBSUB)) 1123 track->subtitle_type = MATROSKA_SUBTYPE_VOBSUB; 1124 else if (!strcmp (track->codec_id, MKV_S_TEXTSSA) 1125 || !strcmp (track->codec_id, MKV_S_TEXTASS) 1126 || !strcmp (track->codec_id, MKV_S_SSA) 1127 || !strcmp (track->codec_id, MKV_S_ASS)) 1128 { 1129 track->subtitle_type = MATROSKA_SUBTYPE_SSA; 1130 } 1131 else if (!strcmp (track->codec_id, MKV_S_TEXTASCII)) 1132 track->subtitle_type = MATROSKA_SUBTYPE_TEXT; 1133 if (!strcmp (track->codec_id, MKV_S_TEXTUTF8)) 1134 { 1135 track->subtitle_type = MATROSKA_SUBTYPE_TEXT; 1136 } 1137 dprintf ("[mkv] | + Codec ID: %s\n", 1138 track->codec_id); 1186 } 1187 1188 case MATROSKA_ID_TRACKDEFAULTDURATION: 1189 { 1190 uint64_t num = ebml_read_uint (s, &l); 1191 if (num == EBML_UINT_INVALID) 1192 goto err_out; 1193 if (num == 0) 1194 dprintf("[mkv] | + Default duration: 0"); 1195 else 1196 { 1197 track->v_frate = 1000000000.0 / num; 1198 track->default_duration = num / 1000000000.0; 1199 dprintf("[mkv] | + Default duration: " 1200 "%.3fms ( = %.3f fps)\n",num/1000000.0,track->v_frate); 1201 } 1139 1202 break; 1140 1141 case MATROSKA_ID_CODECPRIVATE: 1142 { 1143 int x; 1144 uint64_t num = ebml_read_length (s, &x); 1145 // audit: cheap guard against overflows later.. 1146 if (num > SIZE_MAX - 1000) return 0; 1147 l = x + num; 1148 track->private_data = malloc (num); 1149 if (stream_read(s, track->private_data, num) != (int) num) 1150 goto err_out; 1151 track->private_size = num; 1152 dprintf ("[mkv] | + CodecPrivate, length " 1153 "%u\n", track->private_size); 1154 break; 1155 } 1156 1157 case MATROSKA_ID_TRACKLANGUAGE: 1158 free(track->language); 1159 track->language = ebml_read_utf8 (s, &l); 1160 if (track->language == NULL) 1161 goto err_out; 1162 dprintf ("[mkv] | + Language: %s\n", 1163 track->language); 1164 break; 1165 1166 case MATROSKA_ID_TRACKFLAGDEFAULT: 1167 { 1168 uint64_t num = ebml_read_uint (s, &l); 1169 if (num == EBML_UINT_INVALID) 1170 goto err_out; 1171 track->default_track = num; 1172 dprintf ("[mkv] | + Default flag: %u\n", 1173 track->default_track); 1174 break; 1175 } 1176 1177 case MATROSKA_ID_TRACKDEFAULTDURATION: 1178 { 1179 uint64_t num = ebml_read_uint (s, &l); 1180 if (num == EBML_UINT_INVALID) 1181 goto err_out; 1182 if (num == 0) 1183 dprintf ("[mkv] | + Default duration: 0"); 1184 else 1185 { 1186 track->v_frate = 1000000000.0 / num; 1187 track->default_duration = num / 1000000000.0; 1188 dprintf ("[mkv] | + Default duration: " 1189 "%.3fms ( = %.3f fps)\n",num/1000000.0,track->v_frate); 1190 } 1191 break; 1192 } 1203 } 1193 1204 1194 1205 case MATROSKA_ID_TRACKENCODINGS: 1195 l = demux_mkv_read_trackencodings (demuxer, track); 1196 if (l == 0) 1197 goto err_out; 1198 break; 1206 l = demux_mkv_read_trackencodings (demuxer, track); 1207 if (l == 0) 1208 goto err_out; 1209 break; 1210 1211 default: 1212 ebml_read_skip (s, &l); 1213 break; 1214 } 1215 length -= l + il; 1216 } 1217 1218 mkv_d->tracks[mkv_d->num_tracks++] = track; 1219 return len; 1220 1221 err_out: 1222 demux_mkv_free_trackentry(track); 1223 return 0; 1224 } 1225 1226 static int 1227 demux_mkv_read_tracks (demuxer_t *demuxer) 1228 { 1229 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1230 stream_t *s = demuxer->stream; 1231 uint64_t length, l; 1232 int il; 1233 1234 mkv_d->tracks = malloc (sizeof (*mkv_d->tracks)); 1235 mkv_d->num_tracks = 0; 1236 1237 length = ebml_read_length (s, NULL); 1238 while (length > 0) 1239 { 1240 switch (ebml_read_id (s, &il)) 1241 { 1242 case MATROSKA_ID_TRACKENTRY: 1243 dprintf("[mkv] | + a track...\n"); 1244 mkv_d->tracks = realloc (mkv_d->tracks, 1245 (mkv_d->num_tracks+1) 1246 *sizeof (*mkv_d->tracks)); 1247 l = demux_mkv_read_trackentry (demuxer); 1248 if (l == 0) 1249 return 1; 1250 break; 1199 1251 1200 1252 default: … … 1202 1254 break; 1203 1255 } 1204 length -= l + il; 1205 } 1206 1207 mkv_d->tracks[mkv_d->num_tracks++] = track; 1208 return len; 1209 1210 err_out: 1211 demux_mkv_free_trackentry(track); 1256 length -= l + il; 1257 } 1258 return 0; 1259 } 1260 1261 extern int index_mode; 1262 1263 static int 1264 demux_mkv_read_cues (demuxer_t *demuxer) 1265 { 1266 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1267 stream_t *s = demuxer->stream; 1268 uint64_t length, l, time, track, pos; 1269 off_t off; 1270 int i, il; 1271 1272 if (index_mode == 0) { 1273 ebml_read_skip (s, NULL); 1212 1274 return 0; 1275 } 1276 off = stream_tell (s); 1277 for (i=0; i<mkv_d->parsed_cues_num; i++) 1278 if (mkv_d->parsed_cues[i] == off) 1279 { 1280 ebml_read_skip (s, NULL); 1281 return 0; 1282 } 1283 mkv_d->parsed_cues = realloc (mkv_d->parsed_cues, 1284 (mkv_d->parsed_cues_num+1) 1285 * sizeof (off_t)); 1286 mkv_d->parsed_cues[mkv_d->parsed_cues_num++] = off; 1287 1288 dprintf("[mkv] /---- [ parsing cues ] -----------\n"); 1289 length = ebml_read_length (s, NULL); 1290 1291 while (length > 0) 1292 { 1293 time = track = pos = EBML_UINT_INVALID; 1294 1295 switch (ebml_read_id (s, &il)) 1296 { 1297 case MATROSKA_ID_POINTENTRY: 1298 { 1299 uint64_t len; 1300 1301 len = ebml_read_length (s, &i); 1302 l = len + i; 1303 1304 while (len > 0) 1305 { 1306 uint64_t l; 1307 int il; 1308 1309 switch (ebml_read_id (s, &il)) 1310 { 1311 case MATROSKA_ID_CUETIME: 1312 time = ebml_read_uint (s, &l); 1313 break; 1314 1315 case MATROSKA_ID_CUETRACKPOSITION: 1316 { 1317 uint64_t le; 1318 1319 le = ebml_read_length (s, &i); 1320 l = le + i; 1321 1322 while (le > 0) 1323 { 1324 uint64_t l; 1325 int il; 1326 1327 switch (ebml_read_id (s, &il)) 1328 { 1329 case MATROSKA_ID_CUETRACK: 1330 track = ebml_read_uint (s, &l); 1331 break; 1332 1333 case MATROSKA_ID_CUECLUSTERPOSITION: 1334 pos = ebml_read_uint (s, &l); 1335 break; 1336 1337 default: 1338 ebml_read_skip (s, &l); 1339 break; 1340 } 1341 le -= l + il; 1342 } 1343 break; 1344 } 1345 1346 default: 1347 ebml_read_skip (s, &l); 1348 break; 1349 } 1350 len -= l + il; 1351 } 1352 break; 1353 } 1354 1355 default: 1356 ebml_read_skip (s, &l); 1357 break; 1358 } 1359 1360 length -= l + il; 1361 1362 if (time != EBML_UINT_INVALID && track != EBML_UINT_INVALID 1363 && pos != EBML_UINT_INVALID) 1364 { 1365 grow_array(&mkv_d->indexes, mkv_d->num_indexes, sizeof(mkv_index_t)); 1366 mkv_d->indexes[mkv_d->num_indexes].tnum = track; 1367 mkv_d->indexes[mkv_d->num_indexes].timecode = time; 1368 mkv_d->indexes[mkv_d->num_indexes].filepos =mkv_d->segment_start+pos; 1369 dprintf("[mkv] |+ found cue point " 1370 "for track %"PRIu64": timecode %"PRIu64", filepos: %"PRIu64"\n", 1371 track, time, mkv_d->segment_start + pos); 1372 mkv_d->num_indexes++; 1373 } 1374 } 1375 1376 dprintf("[mkv] \\---- [ parsing cues ] -----------\n"); 1377 return 0; 1213 1378 } 1214 1379 1215 1380 static int 1216 demux_mkv_read_tracks (demuxer_t *demuxer) 1217 { 1218 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1219 stream_t *s = demuxer->stream; 1220 uint64_t length, l; 1221 int il; 1222 1223 mkv_d->tracks = (mkv_track_t **) malloc (sizeof (*mkv_d->tracks)); 1224 mkv_d->num_tracks = 0; 1225 1226 length = ebml_read_length (s, NULL); 1227 while (length > 0) 1228 { 1229 switch (ebml_read_id (s, &il)) 1230 { 1231 case MATROSKA_ID_TRACKENTRY: 1232 dprintf ("[mkv] | + a track...\n"); 1233 mkv_d->tracks = (mkv_track_t **) realloc (mkv_d->tracks, 1234 (mkv_d->num_tracks+1) 1235 *sizeof (*mkv_d->tracks)); 1236 l = demux_mkv_read_trackentry (demuxer); 1237 if (l == 0) 1238 return 1; 1381 demux_mkv_read_chapters (demuxer_t *demuxer) 1382 { 1383 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1384 stream_t *s = demuxer->stream; 1385 uint64_t length, l; 1386 int il; 1387 1388 if (demuxer->chapters) 1389 { 1390 ebml_read_skip (s, NULL); 1391 return 0; 1392 } 1393 1394 dprintf("[mkv] /---- [ parsing chapters ] ---------\n"); 1395 length = ebml_read_length (s, NULL); 1396 1397 while (length > 0) 1398 { 1399 switch (ebml_read_id (s, &il)) 1400 { 1401 case MATROSKA_ID_EDITIONENTRY: 1402 { 1403 uint64_t len; 1404 int i; 1405 1406 len = ebml_read_length (s, &i); 1407 l = len + i; 1408 1409 while (len > 0) 1410 { 1411 uint64_t l; 1412 int il; 1413 1414 switch (ebml_read_id (s, &il)) 1415 { 1416 case MATROSKA_ID_CHAPTERATOM: 1417 { 1418 uint64_t len, start=0, end=0; 1419 char* name = 0; 1420 int i; 1421 int cid; 1422 1423 len = ebml_read_length (s, &i); 1424 l = len + i; 1425 1426 while (len > 0) 1427 { 1428 uint64_t l; 1429 int il; 1430 1431 switch (ebml_read_id (s, &il)) 1432 { 1433 case MATROSKA_ID_CHAPTERTIMESTART: 1434 start = ebml_read_uint (s, &l) / 1000000; 1435 break; 1436 1437 case MATROSKA_ID_CHAPTERTIMEEND: 1438 end = ebml_read_uint (s, &l) / 1000000; 1439 break; 1440 1441 case MATROSKA_ID_CHAPTERDISPLAY: 1442 { 1443 uint64_t len; 1444 int i; 1445 1446 len = ebml_read_length (s, &i); 1447 l = len + i; 1448 while (len > 0) 1449 { 1450 uint64_t l; 1451 int il; 1452 1453 switch (ebml_read_id (s, &il)) 1454 { 1455 case MATROSKA_ID_CHAPSTRING: 1456 name = ebml_read_utf8 (s, &l); 1457 break; 1458 default: 1459 ebml_read_skip (s, &l); 1460 break; 1461 } 1462 len -= l + il; 1463 } 1464 } 1465 break; 1466 1467 default: 1468 ebml_read_skip (s, &l); 1469 break; 1470 } 1471 len -= l + il; 1472 } 1473 1474 if (!name) 1475 name = strdup("(unnamed)"); 1476 1477 cid = demuxer_add_chapter(demuxer, name, start, end); 1478 1479 dprintf( 1480 "[mkv] Chapter %u from %02d:%02d:%02d." 1481 "%03d to %02d:%02d:%02d.%03d, %s\n", 1482 cid, 1483 (int) (start / 60 / 60 / 1000), 1484 (int) ((start / 60 / 1000) % 60), 1485 (int) ((start / 1000) % 60), 1486 (int) (start % 1000), 1487 (int) (end / 60 / 60 / 1000), 1488 (int) ((end / 60 / 1000) % 60), 1489 (int) ((end / 1000) % 60), 1490 (int) (end % 1000), name); 1491 1492 free(name); 1493 break; 1494 } 1495 1496 default: 1497 ebml_read_skip (s, &l); 1498 break; 1499 } 1500 len -= l + il; 1501 } 1239 1502 break; 1503 } 1504 1505 default: 1506 ebml_read_skip (s, &l); 1507 break; 1508 } 1509 1510 length -= l + il; 1511 } 1512 1513 dprintf("[mkv] \\---- [ parsing chapters ] ---------\n"); 1514 return 0; 1515 } 1516 1517 static int 1518 demux_mkv_read_tags (demuxer_t *demuxer) 1519 { 1520 ebml_read_skip (demuxer->stream, NULL); 1521 return 0; 1522 } 1523 1524 static int 1525 demux_mkv_read_attachments (demuxer_t *demuxer) 1526 { 1527 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1528 stream_t *s = demuxer->stream; 1529 uint64_t length, l; 1530 int il; 1531 1532 dprintf("[mkv] /---- [ parsing attachments ] ---------\n"); 1533 length = ebml_read_length (s, NULL); 1534 1535 while (length > 0) 1536 { 1537 switch (ebml_read_id (s, &il)) 1538 { 1539 case MATROSKA_ID_ATTACHEDFILE: 1540 { 1541 uint64_t len; 1542 int i; 1543 char* name = NULL; 1544 char* mime = NULL; 1545 uint64_t uid = 0; 1546 char* data = NULL; 1547 int data_size = 0; 1548 1549 len = ebml_read_length (s, &i); 1550 l = len + i; 1551 1552 dprintf("[mkv] | + an attachment...\n"); 1553 1554 grow_array(&mkv_d->attachments, mkv_d->num_attachments, 1555 sizeof(*mkv_d->attachments)); 1556 1557 while (len > 0) 1558 { 1559 uint64_t l; 1560 int il; 1561 1562 switch (ebml_read_id (s, &il)) 1563 { 1564 case MATROSKA_ID_FILENAME: 1565 name = ebml_read_utf8 (s, &l); 1566 if (name == NULL) 1567 return 0; 1568 dprintf("[mkv] | + FileName: %s\n", 1569 name); 1570 break; 1571 1572 case MATROSKA_ID_FILEMIMETYPE: 1573 mime = ebml_read_ascii (s, &l); 1574 if (mime == NULL) 1575 return 0; 1576 dprintf("[mkv] | + FileMimeType: %s\n", 1577 mime); 1578 break; 1579 1580 case MATROSKA_ID_FILEUID: 1581 uid = ebml_read_uint (s, &l); 1582 break; 1583 1584 case MATROSKA_ID_FILEDATA: 1585 { 1586 int x; 1587 uint64_t num = ebml_read_length (s, &x); 1588 l = x + num; 1589 free(data); 1590 data = malloc (num); 1591 if (stream_read(s, data, num) != (int) num) 1592 { 1593 free(data); 1594 return 0; 1595 } 1596 data_size = num; 1597 dprintf("[mkv] | + FileData, length " 1598 "%u\n", data_size); 1599 break; 1600 } 1601 1602 default: 1603 ebml_read_skip (s, &l); 1604 break; 1605 } 1606 len -= l + il; 1607 } 1608 1609 mkv_d->attachments[mkv_d->num_attachments].name = name; 1610 mkv_d->attachments[mkv_d->num_attachments].mime = mime; 1611 mkv_d->attachments[mkv_d->num_attachments].uid = uid; 1612 mkv_d->attachments[mkv_d->num_attachments].data = data; 1613 mkv_d->attachments[mkv_d->num_attachments].data_size = data_size; 1614 mkv_d->num_attachments ++; 1615 dprintf("[mkv] Attachment: %s, %s, %u bytes\n", 1616 name, mime, data_size); 1617 #ifdef USE_ASS 1618 if (extract_embedded_fonts && name && data && data_size && 1619 mime && (strcmp(mime, "application/x-truetype-font") == 0 || 1620 strcmp(mime, "application/x-font") == 0)) 1621 ass_process_font(ass_library, name, data, data_size); 1622 #endif 1623 break; 1624 } 1625 1626 default: 1627 ebml_read_skip (s, &l); 1628 break; 1629 } 1630 length -= l + il; 1631 } 1632 1633 dprintf("[mkv] \\---- [ parsing attachments ] ---------\n"); 1634 return 0; 1635 } 1636 1637 static int 1638 demux_mkv_read_seekhead (demuxer_t *demuxer) 1639 { 1640 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1641 stream_t *s = demuxer->stream; 1642 uint64_t length, l, seek_pos, saved_pos, num; 1643 uint32_t seek_id; 1644 int i, il, res = 0; 1645 off_t off; 1646 1647 off = stream_tell (s); 1648 for (i=0; i<mkv_d->parsed_seekhead_num; i++) 1649 if (mkv_d->parsed_seekhead[i] == off) 1650 { 1651 ebml_read_skip (s, NULL); 1652 return 0; 1653 } 1654 mkv_d->parsed_seekhead = realloc (mkv_d->parsed_seekhead, 1655 (mkv_d->parsed_seekhead_num+1) 1656 * sizeof (off_t)); 1657 mkv_d->parsed_seekhead[mkv_d->parsed_seekhead_num++] = off; 1658 1659 dprintf("[mkv] /---- [ parsing seek head ] ---------\n"); 1660 length = ebml_read_length (s, NULL); 1661 /* off now holds the position of the next element after the seek head. */ 1662 off = stream_tell (s) + length; 1663 while (length > 0 && !res) 1664 { 1665 1666 seek_id = 0; 1667 seek_pos = EBML_UINT_INVALID; 1668 1669 switch (ebml_read_id (s, &il)) 1670 { 1671 case MATROSKA_ID_SEEKENTRY: 1672 { 1673 uint64_t len; 1674 1675 len = ebml_read_length (s, &i); 1676 l = len + i; 1677 1678 while (len > 0) 1679 { 1680 uint64_t l; 1681 int il; 1682 1683 switch (ebml_read_id (s, &il)) 1684 { 1685 case MATROSKA_ID_SEEKID: 1686 num = ebml_read_uint (s, &l); 1687 if (num != EBML_UINT_INVALID) 1688 seek_id = num; 1689 break; 1690 1691 case MATROSKA_ID_SEEKPOSITION: 1692 seek_pos = ebml_read_uint (s, &l); 1693 break; 1694 1695 default: 1696 ebml_read_skip (s, &l); 1697 break; 1698 } 1699 len -= l + il; 1700 } 1701 1702 break; 1703 } 1240 1704 1241 1705 default: … … 1243 1707 break; 1244 1708 } 1245 length -= l + il; 1246 } 1247 return 0; 1248 } 1249 1250 extern int index_mode; 1709 length -= l + il; 1710 1711 if (seek_id == 0 || seek_id == MATROSKA_ID_CLUSTER 1712 || seek_pos == EBML_UINT_INVALID || 1713 ((mkv_d->segment_start + seek_pos) >= (uint64_t)demuxer->movi_end)) 1714 continue; 1715 1716 saved_pos = stream_tell (s); 1717 if (!stream_seek (s, mkv_d->segment_start + seek_pos)) 1718 res = 1; 1719 else 1720 { 1721 if (ebml_read_id (s, &il) != seek_id) 1722 res = 1; 1723 else 1724 switch (seek_id) 1725 { 1726 case MATROSKA_ID_CUES: 1727 if (demux_mkv_read_cues (demuxer)) 1728 res = 1; 1729 break; 1730 1731 case MATROSKA_ID_TAGS: 1732 if (demux_mkv_read_tags (demuxer)) 1733 res = 1; 1734 break; 1735 1736 case MATROSKA_ID_SEEKHEAD: 1737 if (demux_mkv_read_seekhead (demuxer)) 1738 res = 1; 1739 break; 1740 1741 case MATROSKA_ID_CHAPTERS: 1742 if (demux_mkv_read_chapters (demuxer)) 1743 res = 1; 1744 break; 1745 } 1746 } 1747 1748 stream_seek (s, saved_pos); 1749 } 1750 if (res) 1751 { 1752 /* If there was an error then try to skip this seek head. */ 1753 if (stream_seek (s, off)) 1754 res = 0; 1755 } 1756 else 1757 if (length > 0) 1758 stream_seek (s, stream_tell (s) + length); 1759 dprintf("[mkv] \\---- [ parsing seek head ] ---------\n"); 1760 return res; 1761 } 1251 1762 1252 1763 static int 1253 demux_mkv_read_cues (demuxer_t *demuxer) 1254 { 1255 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1256 stream_t *s = demuxer->stream; 1257 uint64_t length, l, time, track, pos; 1258 off_t off; 1259 int i, il; 1260 1261 if (index_mode == 0) { 1262 ebml_read_skip (s, NULL); 1263 return 0; 1264 } 1265 1266 off = stream_tell (s); 1267 for (i=0; i<mkv_d->parsed_cues_num; i++) 1268 if (mkv_d->parsed_cues[i] == off) 1269 { 1270 ebml_read_skip (s, NULL); 1271 return 0; 1272 } 1273 mkv_d->parsed_cues = (off_t *) realloc (mkv_d->parsed_cues, 1274 (mkv_d->parsed_cues_num+1) 1275 * sizeof (off_t)); 1276 mkv_d->parsed_cues[mkv_d->parsed_cues_num++] = off; 1277 1278 dprintf ("[mkv] /---- [ parsing cues ] -----------\n"); 1279 length = ebml_read_length (s, NULL); 1280 1281 while (length > 0) 1282 { 1283 time = track = pos = EBML_UINT_INVALID; 1284 1285 switch (ebml_read_id (s, &il)) 1286 { 1287 case MATROSKA_ID_POINTENTRY: 1764 demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track, int vid); 1765 static int 1766 demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track, int aid); 1767 static int 1768 demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track, int sid); 1769 1770 static void 1771 display_create_tracks (demuxer_t *demuxer) 1772 { 1773 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *)demuxer->priv; 1774 int i, vid=0, aid=0, sid=0; 1775 1776 for (i=0; i<mkv_d->num_tracks; i++) 1777 { 1778 char *type = "unknown", str[32]; 1779 *str = '\0'; 1780 switch (mkv_d->tracks[i]->type) 1781 { 1782 case MATROSKA_TRACK_VIDEO: 1783 type = "video"; 1784 demux_mkv_open_video(demuxer, mkv_d->tracks[i], vid); 1785 if (mkv_d->tracks[i]->name) 1786 dprintf("ID_VID_%d_NAME=%s\n", vid, mkv_d->tracks[i]->name); 1787 sprintf (str, "-vid %u", vid++); 1788 break; 1789 case MATROSKA_TRACK_AUDIO: 1790 type = "audio"; 1791 demux_mkv_open_audio(demuxer, mkv_d->tracks[i], aid); 1792 if (mkv_d->tracks[i]->name) 1793 dprintf("ID_AID_%d_NAME=%s\n", aid, mkv_d->tracks[i]->name); 1794 dprintf("ID_AID_%d_LANG=%s\n", aid, mkv_d->tracks[i]->language); 1795 sprintf (str, "-aid %u, -alang %.5s",aid++,mkv_d->tracks[i]->language); 1796 break; 1797 case MATROSKA_TRACK_SUBTITLE: 1798 type = "subtitles"; 1799 demux_mkv_open_sub(demuxer, mkv_d->tracks[i], sid); 1800 if (mkv_d->tracks[i]->name) 1801 dprintf("ID_SID_%d_NAME=%s\n", sid, mkv_d->tracks[i]->name); 1802 dprintf("ID_SID_%d_LANG=%s\n", sid, mkv_d->tracks[i]->language); 1803 sprintf (str, "-sid %u, -slang %.5s",sid++,mkv_d->tracks[i]->language); 1804 break; 1805 } 1806 if (mkv_d->tracks[i]->name) 1807 dprintf( MSGTR_MPDEMUX_MKV_TrackIDName, 1808 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id, mkv_d->tracks[i]->name, str); 1809 else 1810 dprintf( MSGTR_MPDEMUX_MKV_TrackID, 1811 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id, str); 1812 } 1813 } 1814 1815 static int 1816 demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track, int vid) 1817 { 1818 BITMAPINFOHEADERw *bih; 1819 void *ImageDesc = NULL; 1820 sh_video_t *sh_v; 1821 1822 if (track->ms_compat) /* MS compatibility mode */ 1823 { 1824 BITMAPINFOHEADERw *src; 1825 1826 if (track->private_data == NULL 1827 || track->private_size < sizeof (BITMAPINFOHEADERw)) 1828 return 1; 1829 1830 src = (BITMAPINFOHEADERw *) track->private_data; 1831 bih = calloc (1, track->private_size); 1832 bih->biSize = le2me_32 (src->biSize); 1833 bih->biWidth = le2me_32 (src->biWidth); 1834 bih->biHeight = le2me_32 (src->biHeight); 1835 bih->biPlanes = le2me_16 (src->biPlanes); 1836 bih->biBitCount = le2me_16 (src->biBitCount); 1837 bih->biCompression = le2me_32 (src->biCompression); 1838 bih->biSizeImage = le2me_32 (src->biSizeImage); 1839 bih->biXPelsPerMeter = le2me_32 (src->biXPelsPerMeter); 1840 bih->biYPelsPerMeter = le2me_32 (src->biYPelsPerMeter); 1841 bih->biClrUsed = le2me_32 (src->biClrUsed); 1842 bih->biClrImportant = le2me_32 (src->biClrImportant); 1843 memcpy((char *) bih + sizeof (BITMAPINFOHEADERw), 1844 (char *) src + sizeof (BITMAPINFOHEADERw), 1845 track->private_size - sizeof (BITMAPINFOHEADERw)); 1846 1847 if (track->v_width == 0) 1848 track->v_width = bih->biWidth; 1849 if (track->v_height == 0) 1850 track->v_height = bih->biHeight; 1851 } 1852 else 1853 { 1854 bih = calloc (1, sizeof (BITMAPINFOHEADERw)); 1855 bih->biSize = sizeof (BITMAPINFOHEADERw); 1856 bih->biWidth = track->v_width; 1857 bih->biHeight = track->v_height; 1858 bih->biBitCount = 24; 1859 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount/8; 1860 1861 if (track->private_size >= sizeof (real_video_props_t) 1862 && (!strcmp (track->codec_id, MKV_V_REALV10) 1863 || !strcmp (track->codec_id, MKV_V_REALV20) 1864 || !strcmp (track->codec_id, MKV_V_REALV30) 1865 || !strcmp (track->codec_id, MKV_V_REALV40))) 1866 { 1867 unsigned char *dst, *src; 1868 real_video_props_t *rvp; 1869 uint32_t type2; 1870 unsigned int cnt; 1871 1872 rvp = (real_video_props_t *) track->private_data; 1873 src = (unsigned char *) (rvp + 1); 1874 1875 cnt = track->private_size - sizeof (real_video_props_t); 1876 bih = realloc(bih, sizeof (BITMAPINFOHEADERw)+8+cnt); 1877 bih->biSize = 48+cnt; 1878 bih->biPlanes = 1; 1879 type2 = be2me_32 (rvp->type2); 1880 if (type2 == 0x10003000 || type2 == 0x10003001) 1881 bih->biCompression=mmioFOURCC('R','V','1','3'); 1882 else 1883 bih->biCompression=mmioFOURCC('R','V',track->codec_id[9],'0'); 1884 dst = (unsigned char *) (bih + 1); 1885 ((unsigned int *) dst)[0] = rvp->type1; 1886 ((unsigned int *) dst)[1] = rvp->type2; 1887 stream_read(demuxer->stream, dst+8, cnt); 1888 track->realmedia = 1; 1889 1890 #ifdef USE_QTX_CODECS 1891 } 1892 else if (track->private_size >= sizeof (ImageDescription) 1893 && !strcmp(track->codec_id, MKV_V_QUICKTIME)) 1894 { 1895 ImageDescriptionPtr idesc; 1896 1897 idesc = (ImageDescriptionPtr) track->private_data; 1898 idesc->idSize = be2me_32 (idesc->idSize); 1899 idesc->cType = be2me_32 (idesc->cType); 1900 idesc->version = be2me_16 (idesc->version); 1901 idesc->revisionLevel = be2me_16 (idesc->revisionLevel); 1902 idesc->vendor = be2me_32 (idesc->vendor); 1903 idesc->temporalQuality = be2me_32 (idesc->temporalQuality); 1904 idesc->spatialQuality = be2me_32 (idesc->spatialQuality); 1905 idesc->width = be2me_16 (idesc->width); 1906 idesc->height = be2me_16 (idesc->height); 1907 idesc->hRes = be2me_32 (idesc->hRes); 1908 idesc->vRes = be2me_32 (idesc->vRes); 1909 idesc->dataSize = be2me_32 (idesc->dataSize); 1910 idesc->frameCount = be2me_16 (idesc->frameCount); 1911 idesc->depth = be2me_16 (idesc->depth); 1912 idesc->clutID = be2me_16 (idesc->clutID); 1913 bih->biPlanes = 1; 1914 bih->biCompression = idesc->cType; 1915 ImageDesc = idesc; 1916 #endif /* USE_QTX_CODECS */ 1917 1918 } 1919 else if (!strcmp(track->codec_id, MKV_V_MPEG1)) 1920 { 1921 bih->biCompression = mmioFOURCC('m', 'p', 'g', '1'); 1922 track->reorder_timecodes = !correct_pts; 1923 } 1924 else if (!strcmp(track->codec_id, MKV_V_MPEG2)) 1925 { 1926 bih->biCompression = mmioFOURCC('m', 'p', 'g', '2'); 1927 track->reorder_timecodes = !correct_pts; 1928 } 1929 else if (!strcmp(track->codec_id, MKV_V_MPEG4_SP) || 1930 !strcmp(track->codec_id, MKV_V_MPEG4_ASP) || 1931 !strcmp(track->codec_id, MKV_V_MPEG4_AP)) 1932 { 1933 bih->biCompression = mmioFOURCC('m', 'p', '4', 'v'); 1934 if (track->private_data && (track->private_size > 0)) 1288 1935 { 1289 uint64_t len; 1290 1291 len = ebml_read_length (s, &i); 1292 l = len + i; 1293 1294 while (len > 0) 1295 { 1296 uint64_t l; 1297 int il; 1298 1299 switch (ebml_read_id (s, &il)) 1300 { 1301 case MATROSKA_ID_CUETIME: 1302 time = ebml_read_uint (s, &l); 1303 break; 1304 1305 case MATROSKA_ID_CUETRACKPOSITION: 1306 { 1307 uint64_t le; 1308 1309 le = ebml_read_length (s, &i); 1310 l = le + i; 1311 1312 while (le > 0) 1313 { 1314 uint64_t l; 1315 int il; 1316 1317 switch (ebml_read_id (s, &il)) 1318 { 1319 case MATROSKA_ID_CUETRACK: 1320 track = ebml_read_uint (s, &l); 1321 break; 1322 1323 case MATROSKA_ID_CUECLUSTERPOSITION: 1324 pos = ebml_read_uint (s, &l); 1325 break; 1326 1327 default: 1328 ebml_read_skip (s, &l); 1329 break; 1330 } 1331 le -= l + il; 1332 } 1333 break; 1334 } 1335 1336 default: 1337 ebml_read_skip (s, &l); 1338 break; 1339 } 1340 len -= l + il; 1341 } 1342 break; 1936 bih->biSize += track->private_size; 1937 bih = realloc (bih, bih->biSize); 1938 memcpy (bih + 1, track->private_data, track->private_size); 1343 1939 } 1344 1345 default: 1346 ebml_read_skip (s, &l); 1347 break; 1348 } 1349 1350 length -= l + il; 1351 1352 if (time != EBML_UINT_INVALID && track != EBML_UINT_INVALID 1353 && pos != EBML_UINT_INVALID) 1354 { 1355 grow_array(&mkv_d->indexes, mkv_d->num_indexes, sizeof(mkv_index_t)); 1356 mkv_d->indexes[mkv_d->num_indexes].tnum = track; 1357 mkv_d->indexes[mkv_d->num_indexes].timecode = time; 1358 mkv_d->indexes[mkv_d->num_indexes].filepos =mkv_d->segment_start+pos; 1359 dprintf ( "[mkv] |+ found cue point " 1360 "for track %"PRIu64": timecode %"PRIu64", filepos: %"PRIu64"\n", 1361 track, time, mkv_d->segment_start + pos); 1362 mkv_d->num_indexes++; 1363 } 1364 } 1365 1366 dprintf ("[mkv] \\---- [ parsing cues ] -----------\n"); 1367 return 0; 1940 track->reorder_timecodes = !correct_pts; 1941 } 1942 else if (!strcmp(track->codec_id, MKV_V_MPEG4_AVC)) 1943 { 1944 bih->biCompression = mmioFOURCC('a', 'v', 'c', '1'); 1945 if (track->private_data && (track->private_size > 0)) 1946 { 1947 bih->biSize += track->private_size; 1948 bih = realloc (bih, bih->biSize); 1949 memcpy (bih + 1, track->private_data, track->private_size); 1950 } 1951 track->reorder_timecodes = !correct_pts; 1952 } 1953 else 1954 { 1955 dprintf(MSGTR_MPDEMUX_MKV_UnknownCodecID, 1956 track->codec_id, track->tnum); 1957 free(bih); 1958 return 1; 1959 } 1960 } 1961 1962 sh_v = new_sh_video_vid (demuxer, track->tnum, vid); 1963 sh_v->bih = bih; 1964 sh_v->format = sh_v->bih->biCompression; 1965 if (track->v_frate == 0.0) 1966 track->v_frate = 25.0; 1967 sh_v->fps = track->v_frate; 1968 sh_v->frametime = 1 / track->v_frate; 1969 sh_v->aspect = 0; 1970 if (!track->realmedia) 1971 { 1972 sh_v->disp_w = track->v_width; 1973 sh_v->disp_h = track->v_height; 1974 if (track->v_dheight) 1975 sh_v->aspect = (float)track->v_dwidth / (float)track->v_dheight; 1976 } 1977 else 1978 { 1979 // vd_realvid.c will set aspect to disp_w/disp_h and rederive 1980 // disp_w and disp_h from the RealVideo stream contents returned 1981 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in 1982 // the Matroska file then it has already been set to PixelWidth/Height 1983 // by check_track_information. 1984 sh_v->disp_w = track->v_dwidth; 1985 sh_v->disp_h = track->v_dheight; 1986 } 1987 sh_v->ImageDesc = ImageDesc; 1988 dprintf("[mkv] Aspect: %f\n", sh_v->aspect); 1989 1990 sh_v->ds = demuxer->video; 1991 return 0; 1368 1992 } 1369 1993 1370 1994 static int 1371 demux_mkv_read_chapters (demuxer_t *demuxer) 1372 { 1373 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1374 stream_t *s = demuxer->stream; 1375 uint64_t length, l; 1376 int il; 1377 1378 if (demuxer->chapters) 1379 { 1380 ebml_read_skip (s, NULL); 1381 return 0; 1382 } 1383 1384 dprintf("[mkv] /---- [ parsing chapters ] ---------\n"); 1385 length = ebml_read_length (s, NULL); 1386 1387 while (length > 0) 1388 { 1389 switch (ebml_read_id (s, &il)) 1390 { 1391 case MATROSKA_ID_EDITIONENTRY: 1995 demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track, int aid) 1996 { 1997 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1998 sh_audio_t *sh_a = new_sh_audio_aid(demuxer, track->tnum, aid); 1999 demux_packet_t *dp; 2000 if(!sh_a) return 1; 2001 mkv_d->audio_tracks[mkv_d->last_aid] = track->tnum; 2002 2003 sh_a->ds = demuxer->audio; 2004 sh_a->wf = malloc (sizeof (WAVEFORMATEX)); 2005 if (track->ms_compat && (track->private_size >= sizeof(WAVEFORMATEX))) 2006 { 2007 WAVEFORMATEX *wf = (WAVEFORMATEX *)track->private_data; 2008 sh_a->wf = realloc(sh_a->wf, track->private_size); 2009 sh_a->wf->wFormatTag = le2me_16 (wf->wFormatTag); 2010 sh_a->wf->nChannels = le2me_16 (wf->nChannels); 2011 sh_a->wf->nSamplesPerSec = le2me_32 (wf->nSamplesPerSec); 2012 sh_a->wf->nAvgBytesPerSec = le2me_32 (wf->nAvgBytesPerSec); 2013 sh_a->wf->nBlockAlign = le2me_16 (wf->nBlockAlign); 2014 sh_a->wf->wBitsPerSample = le2me_16 (wf->wBitsPerSample); 2015 sh_a->wf->cbSize = track->private_size - sizeof(WAVEFORMATEX); 2016 memcpy(sh_a->wf + 1, wf + 1, track->private_size - sizeof(WAVEFORMATEX)); 2017 if (track->a_sfreq == 0.0) 2018 track->a_sfreq = sh_a->wf->nSamplesPerSec; 2019 if (track->a_channels == 0) 2020 track->a_channels = sh_a->wf->nChannels; 2021 if (track->a_bps == 0) 2022 track->a_bps = sh_a->wf->wBitsPerSample; 2023 track->a_formattag = sh_a->wf->wFormatTag; 2024 } 2025 else 2026 { 2027 memset(sh_a->wf, 0, sizeof (WAVEFORMATEX)); 2028 if (!strcmp(track->codec_id, MKV_A_MP3) || 2029 !strcmp(track->codec_id, MKV_A_MP2)) 2030 track->a_formattag = 0x0055; 2031 else if (!strncmp(track->codec_id, MKV_A_AC3, strlen(MKV_A_AC3))) 2032 track->a_formattag = 0x2000; 2033 else if (!strcmp(track->codec_id, MKV_A_DTS)) 2034 track->a_formattag = 0x2001; 2035 else if (!strcmp(track->codec_id, MKV_A_PCM) || 2036 !strcmp(track->codec_id, MKV_A_PCM_BE)) 2037 track->a_formattag = 0x0001; 2038 else if (!strcmp(track->codec_id, MKV_A_AAC_2MAIN) || 2039 !strncmp(track->codec_id, MKV_A_AAC_2LC, 2040 strlen(MKV_A_AAC_2LC)) || 2041 !strcmp(track->codec_id, MKV_A_AAC_2SSR) || 2042 !strcmp(track->codec_id, MKV_A_AAC_4MAIN) || 2043 !strncmp(track->codec_id, MKV_A_AAC_4LC, 2044 strlen(MKV_A_AAC_4LC)) || 2045 !strcmp(track->codec_id, MKV_A_AAC_4SSR) || 2046 !strcmp(track->codec_id, MKV_A_AAC_4LTP) || 2047 !strcmp(track->codec_id, MKV_A_AAC)) 2048 track->a_formattag = mmioFOURCC('M', 'P', '4', 'A'); 2049 else if (!strcmp(track->codec_id, MKV_A_VORBIS)) 2050 { 2051 if (track->private_data == NULL) 2052 return 1; 2053 track->a_formattag = mmioFOURCC('v', 'r', 'b', 's'); 2054 } 2055 else if (!strcmp(track->codec_id, MKV_A_QDMC)) 2056 track->a_formattag = mmioFOURCC('Q', 'D', 'M', 'C'); 2057 else if (!strcmp(track->codec_id, MKV_A_QDMC2)) 2058 track->a_formattag = mmioFOURCC('Q', 'D', 'M', '2'); 2059 else if (!strcmp(track->codec_id, MKV_A_FLAC)) 2060 { 2061 if (track->private_data == NULL || track->private_size == 0) 1392 2062 { 1393 uint64_t len; 1394 int i; 1395 1396 len = ebml_read_length (s, &i); 1397 l = len + i; 1398 1399 while (len > 0) 1400 { 1401 uint64_t l; 1402 int il; 1403 1404 switch (ebml_read_id (s, &il)) 1405 { 1406 case MATROSKA_ID_CHAPTERATOM: 1407 { 1408 uint64_t len, start=0, end=0; 1409 char* name = 0; 1410 int i; 1411 int cid; 1412 1413 len = ebml_read_length (s, &i); 1414 l = len + i; 1415 1416 while (len > 0) 1417 { 1418 uint64_t l; 1419 int il; 1420 1421 switch (ebml_read_id (s, &il)) 1422 { 1423 case MATROSKA_ID_CHAPTERTIMESTART: 1424 start = ebml_read_uint (s, &l) / 1000000; 1425 break; 1426 1427 case MATROSKA_ID_CHAPTERTIMEEND: 1428 end = ebml_read_uint (s, &l) / 1000000; 1429 break; 1430 case MATROSKA_ID_CHAPTERDISPLAY: 1431 { 1432 uint64_t len; 1433 int i; 1434 1435 len = ebml_read_length (s, &i); 1436 l = len + i; 1437 while (len > 0) 1438 { 1439 uint64_t l; 1440 int il; 1441 1442 switch (ebml_read_id (s, &il)) 1443 { 1444 case MATROSKA_ID_CHAPSTRING: 1445 name = ebml_read_utf8 (s, &l); 1446 break; 1447 default: 1448 ebml_read_skip (s, &l); 1449 break; 1450 } 1451 len -= l + il; 1452 } 1453 } 1454 break; 1455 1456 default: 1457 ebml_read_skip (s, &l); 1458 break; 1459 } 1460 len -= l + il; 1461 } 1462 1463 if (!name) 1464 name = strdup("(unnamed)"); 1465 cid = demuxer_add_chapter(demuxer, name, start, end); 1466 1467 dprintf("[mkv] Chapter %u from %02d:%02d:%02d." 1468 "%03d to %02d:%02d:%02d.%03d, %s\n", 1469 cid, 1470 (int) (start / 60 / 60 / 1000), 1471 (int) ((start / 60 / 1000) % 60), 1472 (int) ((start / 1000) % 60), 1473 (int) (start % 1000), 1474 (int) (end / 60 / 60 / 1000), 1475 (int) ((end / 60 / 1000) % 60), 1476 (int) ((end / 1000) % 60), 1477 (int) (end % 1000), name); 1478 free(name); 1479 break; 1480 } 1481 1482 default: 1483 ebml_read_skip (s, &l); 1484 break; 1485 } 1486 len -= l + il; 1487 } 1488 break; 2063 dprintf( 2064 MSGTR_MPDEMUX_MKV_FlacTrackDoesNotContainValidHeaders); 2065 return 1; 1489 2066 } 1490 1491 default: 1492 ebml_read_skip (s, &l); 1493 break; 1494 } 1495 1496 length -= l + il; 1497 } 1498 1499 dprintf("[mkv] \\---- [ parsing chapters ] ---------\n"); 1500 return 0; 1501 } 1502 1503 static int 1504 demux_mkv_read_tags (demuxer_t *demuxer) 1505 { 1506 ebml_read_skip (demuxer->stream, NULL); 1507 return 0; 1508 } 1509 1510 static int 1511 demux_mkv_read_seekhead (demuxer_t *demuxer) 1512 { 1513 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1514 stream_t *s = demuxer->stream; 1515 uint64_t length, l, seek_pos, saved_pos, num; 1516 uint32_t seek_id; 1517 int i, il, res = 0; 1518 off_t off; 1519 1520 off = stream_tell (s); 1521 for (i=0; i<mkv_d->parsed_seekhead_num; i++) 1522 if (mkv_d->parsed_seekhead[i] == off) 1523 { 1524 ebml_read_skip (s, NULL); 1525 return 0; 1526 } 1527 mkv_d->parsed_seekhead = (off_t *) realloc (mkv_d->parsed_seekhead, 1528 (mkv_d->parsed_seekhead_num+1) 1529 * sizeof (off_t)); 1530 mkv_d->parsed_seekhead[mkv_d->parsed_seekhead_num++] = off; 1531 1532 dprintf("[mkv] /---- [ parsing seek head ] ---------\n"); 1533 length = ebml_read_length (s, NULL); 1534 while (length > 0 && !res) 1535 { 1536 1537 seek_id = 0; 1538 seek_pos = EBML_UINT_INVALID; 1539 1540 switch (ebml_read_id (s, &il)) 1541 { 1542 case MATROSKA_ID_SEEKENTRY: 1543 { 1544 uint64_t len; 1545 1546 len = ebml_read_length (s, &i); 1547 l = len + i; 1548 1549 while (len > 0) 1550 { 1551 uint64_t l; 1552 int il; 1553 1554 switch (ebml_read_id (s, &il)) 1555 { 1556 case MATROSKA_ID_SEEKID: 1557 num = ebml_read_uint (s, &l); 1558 if (num != EBML_UINT_INVALID) 1559 seek_id = num; 1560 break; 1561 1562 case MATROSKA_ID_SEEKPOSITION: 1563 seek_pos = ebml_read_uint (s, &l); 1564 break; 1565 1566 default: 1567 ebml_read_skip (s, &l); 1568 break; 1569 } 1570 len -= l + il; 1571 } 1572 1573 break; 1574 } 1575 1576 default: 1577 ebml_read_skip (s, &l); 1578 break; 1579 } 1580 length -= l + il; 1581 1582 if (seek_id == 0 || seek_id == MATROSKA_ID_CLUSTER 1583 || seek_pos == EBML_UINT_INVALID || 1584 ((mkv_d->segment_start + seek_pos) >= (uint64_t)demuxer->movi_end)) 1585 continue; 1586 1587 saved_pos = stream_tell (s); 1588 if (!stream_seek (s, mkv_d->segment_start + seek_pos)) 1589 res = 1; 1590 else 1591 { 1592 if (ebml_read_id (s, &il) != seek_id) 1593 res = 1; 1594 else 1595 switch (seek_id) 1596 { 1597 case MATROSKA_ID_CUES: 1598 if (demux_mkv_read_cues (demuxer)) 1599 res = 1; 1600 break; 1601 1602 case MATROSKA_ID_TAGS: 1603 if (demux_mkv_read_tags (demuxer)) 1604 res = 1; 1605 break; 1606 1607 case MATROSKA_ID_SEEKHEAD: 1608 if (demux_mkv_read_seekhead (demuxer)) 1609 res = 1; 1610 break; 1611 1612 case MATROSKA_ID_CHAPTERS: 1613 if (demux_mkv_read_chapters (demuxer)) 1614 res = 1; 1615 break; 1616 } 1617 } 1618 1619 stream_seek (s, saved_pos); 1620 } 1621 if (length > 0) 1622 stream_seek (s, stream_tell (s) + length); 1623 dprintf("[mkv] \\---- [ parsing seek head ] ---------\n"); 1624 return res; 1625 } 1626 1627 static void 1628 display_tracks (mkv_demuxer_t *mkv_d) 1629 { 1630 int i, vid=0, aid=0, sid=0; 1631 1632 for (i=0; i<mkv_d->num_tracks; i++) 1633 { 1634 char *type = "unknown", str[32]; 1635 *str = '\0'; 1636 switch (mkv_d->tracks[i]->type) 1637 { 1638 case MATROSKA_TRACK_VIDEO: 1639 type = "video"; 1640 dprintf("ID_VIDEO_ID=%d\n", vid); 1641 sprintf (str, "-vid %u", vid++); 1642 break; 1643 case MATROSKA_TRACK_AUDIO: 1644 type = "audio"; 1645 dprintf("ID_AUDIO_ID=%d\n", aid); 1646 dprintf("ID_AID_%d_LANG=%s\n", aid, mkv_d->tracks[i]->language); 1647 sprintf (str, "-aid %u, -alang %.5s",aid++,mkv_d->tracks[i]->language); 1648 break; 1649 case MATROSKA_TRACK_SUBTITLE: 1650 type = "subtitles"; 1651 dprintf("ID_SUBTITLE_ID=%d\n", sid); 1652 dprintf("ID_SID_%d_LANG=%s\n", sid, mkv_d->tracks[i]->language); 1653 sprintf (str, "-sid %u, -slang %.5s",sid++,mkv_d->tracks[i]->language); 1654 break; 1655 } 1656 dprintf("[mkv] Track ID %u: %s (%s), %s\n", 1657 mkv_d->tracks[i]->tnum, type, mkv_d->tracks[i]->codec_id, str); 1658 } 1659 } 1660 1661 static int 1662 demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track) 1663 { 1664 BITMAPINFOHEADERw *bih; 1665 void *ImageDesc = NULL; 1666 sh_video_t *sh_v; 1667 1668 if (track->ms_compat) /* MS compatibility mode */ 1669 { 1670 BITMAPINFOHEADERw *src; 1671 1672 if (track->private_data == NULL 1673 || track->private_size < sizeof (BITMAPINFOHEADERw)) 1674 return 1; 1675 1676 src = (BITMAPINFOHEADERw *) track->private_data; 1677 bih = (BITMAPINFOHEADERw *) malloc (track->private_size); 1678 memset (bih, 0, track->private_size); 1679 bih->biSize = le2me_32 (src->biSize); 1680 bih->biWidth = le2me_32 (src->biWidth); 1681 bih->biHeight = le2me_32 (src->biHeight); 1682 bih->biPlanes = le2me_16 (src->biPlanes); 1683 bih->biBitCount = le2me_16 (src->biBitCount); 1684 bih->biCompression = le2me_32 (src->biCompression); 1685 bih->biSizeImage = le2me_32 (src->biSizeImage); 1686 bih->biXPelsPerMeter = le2me_32 (src->biXPelsPerMeter); 1687 bih->biYPelsPerMeter = le2me_32 (src->biYPelsPerMeter); 1688 bih->biClrUsed = le2me_32 (src->biClrUsed); 1689 bih->biClrImportant = le2me_32 (src->biClrImportant); 1690 memcpy((char *) bih + sizeof (BITMAPINFOHEADERw), 1691 (char *) src + sizeof (BITMAPINFOHEADERw), 1692 track->private_size - sizeof (BITMAPINFOHEADERw)); 1693 1694 if (track->v_width == 0) 1695 track->v_width = bih->biWidth; 1696 if (track->v_height == 0) 1697 track->v_height = bih->biHeight; 1698 } 1699 else 1700 { 1701 bih = (BITMAPINFOHEADERw*) malloc (sizeof (BITMAPINFOHEADERw)); 1702 memset (bih, 0, sizeof (BITMAPINFOHEADERw)); 1703 bih->biSize = sizeof (BITMAPINFOHEADERw); 1704 bih->biWidth = track->v_width; 1705 bih->biHeight = track->v_height; 1706 bih->biBitCount = 24; 1707 bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount/8; 1708 1709 if (track->private_size >= sizeof (real_video_props_t) 1710 && (!strcmp (track->codec_id, MKV_V_REALV10) 1711 || !strcmp (track->codec_id, MKV_V_REALV20) 1712 || !strcmp (track->codec_id, MKV_V_REALV30) 1713 || !strcmp (track->codec_id, MKV_V_REALV40))) 1714 { 1715 unsigned char *dst, *src; 1716 real_video_props_t *rvp; 1717 uint32_t type2; 1718 1719 rvp = (real_video_props_t *) track->private_data; 1720 src = (unsigned char *) (rvp + 1); 1721 1722 bih = (BITMAPINFOHEADERw *) realloc(bih, 1723 sizeof (BITMAPINFOHEADERw)+12); 1724 bih->biSize = 48; 1725 bih->biPlanes = 1; 1726 type2 = be2me_32 (rvp->type2); 1727 if (type2 == 0x10003000 || type2 == 0x10003001) 1728 bih->biCompression=mmioFOURCC('R','V','1','3'); 1729 else 1730 bih->biCompression=mmioFOURCC('R','V',track->codec_id[9],'0'); 1731 dst = (unsigned char *) (bih + 1); 1732 ((unsigned int *) dst)[0] = be2me_32 (rvp->type1); 1733 ((unsigned int *) dst)[1] = type2; 1734 1735 if (bih->biCompression <= 0x30335652 && type2 >= 0x20200002) 1736 { 1737 /* read secondary WxH for the cmsg24[] (see vd_realvid.c) */ 1738 ((unsigned short *)(bih+1))[4] = 4 * (unsigned short) src[0]; 1739 ((unsigned short *)(bih+1))[5] = 4 * (unsigned short) src[1]; 1740 } 1741 else 1742 memset(&dst[8], 0, 4); 1743 track->realmedia = 1; 1744 1745 #ifdef USE_QTX_CODECS 1746 } 1747 else if (track->private_size >= sizeof (ImageDescription) 1748 && !strcmp(track->codec_id, MKV_V_QUICKTIME)) 1749 { 1750 ImageDescriptionPtr idesc; 1751 1752 idesc = (ImageDescriptionPtr) track->private_data; 1753 idesc->idSize = be2me_32 (idesc->idSize); 1754 idesc->cType = be2me_32 (idesc->cType); 1755 idesc->version = be2me_16 (idesc->version); 1756 idesc->revisionLevel = be2me_16 (idesc->revisionLevel); 1757 idesc->vendor = be2me_32 (idesc->vendor); 1758 idesc->temporalQuality = be2me_32 (idesc->temporalQuality); 1759 idesc->spatialQuality = be2me_32 (idesc->spatialQuality); 1760 idesc->width = be2me_16 (idesc->width); 1761 idesc->height = be2me_16 (idesc->height); 1762 idesc->hRes = be2me_32 (idesc->hRes); 1763 idesc->vRes = be2me_32 (idesc->vRes); 1764 idesc->dataSize = be2me_32 (idesc->dataSize); 1765 idesc->frameCount = be2me_16 (idesc->frameCount); 1766 idesc->depth = be2me_16 (idesc->depth); 1767 idesc->clutID = be2me_16 (idesc->clutID); 1768 bih->biPlanes = 1; 1769 bih->biCompression = idesc->cType; 1770 ImageDesc = idesc; 1771 #endif /* USE_QTX_CODECS */ 1772 1773 } 1774 else if (!strcmp(track->codec_id, MKV_V_MPEG1)) 1775 { 1776 bih->biCompression = mmioFOURCC('m', 'p', 'g', '1'); 1777 track->reorder_timecodes = 1; 1778 } 1779 else if (!strcmp(track->codec_id, MKV_V_MPEG2)) 1780 { 1781 bih->biCompression = mmioFOURCC('m', 'p', 'g', '2'); 1782 track->reorder_timecodes = 1; 1783 } 1784 else if (!strcmp(track->codec_id, MKV_V_MPEG4_SP) || 1785 !strcmp(track->codec_id, MKV_V_MPEG4_ASP) || 1786 !strcmp(track->codec_id, MKV_V_MPEG4_AP)) 1787 { 1788 bih->biCompression = mmioFOURCC('m', 'p', '4', 'v'); 1789 if (track->private_data && (track->private_size > 0)) 1790 { 1791 bih->biSize += track->private_size; 1792 bih = (BITMAPINFOHEADERw *) realloc (bih, bih->biSize); 1793 memcpy (bih + 1, track->private_data, track->private_size); 1794 } 1795 track->reorder_timecodes = !correct_pts; 1796 } 1797 else if (!strcmp(track->codec_id, MKV_V_MPEG4_AVC)) 1798 { 1799 bih->biCompression = mmioFOURCC('a', 'v', 'c', '1'); 1800 if (track->private_data && (track->private_size > 0)) 1801 { 1802 bih->biSize += track->private_size; 1803 bih = (BITMAPINFOHEADERw *) realloc (bih, bih->biSize); 1804 memcpy (bih + 1, track->private_data, track->private_size); 1805 } 1806 track->reorder_timecodes = 1; 1807 } 1808 else 1809 { 1810 dprintf ("[mkv] Unknown/unsupported CodecID " 1811 "(%s) or missing/bad CodecPrivate data (track %u).\n", 1812 track->codec_id, track->tnum); 1813 free(bih); 1814 return 1; 1815 } 1816 } 1817 1818 sh_v = new_sh_video (demuxer, track->tnum); 1819 sh_v->bih = bih; 1820 sh_v->format = sh_v->bih->biCompression; 1821 if (track->v_frate == 0.0) 1822 track->v_frate = 25.0; 1823 sh_v->fps = track->v_frate; 1824 sh_v->frametime = 1 / track->v_frate; 1825 sh_v->aspect = 0; 1826 if (!track->realmedia) 1827 { 1828 sh_v->disp_w = track->v_width; 1829 sh_v->disp_h = track->v_height; 1830 if (track->v_dheight) 1831 sh_v->aspect = (float)track->v_dwidth / (float)track->v_dheight; 1832 } 1833 else 1834 { 1835 // vd_realvid.c will set aspect to disp_w/disp_h and rederive 1836 // disp_w and disp_h from the RealVideo stream contents returned 1837 // by the Real DLLs. If DisplayWidth/DisplayHeight was not set in 1838 // the Matroska file then it has already been set to PixelWidth/Height 1839 // by check_track_information. 1840 sh_v->disp_w = track->v_dwidth; 1841 sh_v->disp_h = track->v_dheight; 1842 } 1843 sh_v->ImageDesc = ImageDesc; 1844 dprintf ("[mkv] Aspect: %f\n", sh_v->aspect); 1845 1846 sh_v->ds = demuxer->video; 1847 return 0; 1848 } 1849 1850 static int 1851 demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track) 1852 { 1853 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 1854 sh_audio_t *sh_a = new_sh_audio(demuxer, track->tnum); 1855 if(!sh_a) return 1; 1856 mkv_d->audio_tracks[mkv_d->last_aid] = track->tnum; 1857 demux_packet_t *dp; 1858 1859 sh_a->ds = demuxer->audio; 1860 sh_a->wf = (WAVEFORMATEX *) malloc (sizeof (WAVEFORMATEX)); 1861 if (track->ms_compat && (track->private_size >= sizeof(WAVEFORMATEX))) 1862 { 1863 WAVEFORMATEX *wf = (WAVEFORMATEX *)track->private_data; 1864 sh_a->wf = (WAVEFORMATEX *) realloc(sh_a->wf, track->private_size); 1865 sh_a->wf->wFormatTag = le2me_16 (wf->wFormatTag); 1866 sh_a->wf->nChannels = le2me_16 (wf->nChannels); 1867 sh_a->wf->nSamplesPerSec = le2me_32 (wf->nSamplesPerSec); 1868 sh_a->wf->nAvgBytesPerSec = le2me_32 (wf->nAvgBytesPerSec); 1869 sh_a->wf->nBlockAlign = le2me_16 (wf->nBlockAlign); 1870 sh_a->wf->wBitsPerSample = le2me_16 (wf->wBitsPerSample); 1871 sh_a->wf->cbSize = track->private_size - sizeof(WAVEFORMATEX); 1872 memcpy(sh_a->wf + 1, wf + 1, track->private_size - sizeof(WAVEFORMATEX)); 1873 if (track->a_sfreq == 0.0) 1874 track->a_sfreq = sh_a->wf->nSamplesPerSec; 1875 if (track->a_channels == 0) 1876 track->a_channels = sh_a->wf->nChannels; 1877 if (track->a_bps == 0) 1878 track->a_bps = sh_a->wf->wBitsPerSample; 1879 track->a_formattag = sh_a->wf->wFormatTag; 1880 } 1881 else 1882 { 1883 memset(sh_a->wf, 0, sizeof (WAVEFORMATEX)); 1884 if (!strcmp(track->codec_id, MKV_A_MP3) || 1885 !strcmp(track->codec_id, MKV_A_MP2)) 1886 track->a_formattag = 0x0055; 1887 else if (!strncmp(track->codec_id, MKV_A_AC3, strlen(MKV_A_AC3))) 1888 track->a_formattag = 0x2000; 1889 else if (!strcmp(track->codec_id, MKV_A_DTS)) 1890 track->a_formattag = 0x2001; 1891 else if (!strcmp(track->codec_id, MKV_A_PCM) || 1892 !strcmp(track->codec_id, MKV_A_PCM_BE)) 1893 track->a_formattag = 0x0001; 1894 else if (!strcmp(track->codec_id, MKV_A_AAC_2MAIN) || 1895 !strncmp(track->codec_id, MKV_A_AAC_2LC, 1896 strlen(MKV_A_AAC_2LC)) || 1897 !strcmp(track->codec_id, MKV_A_AAC_2SSR) || 1898 !strcmp(track->codec_id, MKV_A_AAC_4MAIN) || 1899 !strncmp(track->codec_id, MKV_A_AAC_4LC, 1900 strlen(MKV_A_AAC_4LC)) || 1901 !strcmp(track->codec_id, MKV_A_AAC_4SSR) || 1902 !strcmp(track->codec_id, MKV_A_AAC_4LTP) || 1903 !strcmp(track->codec_id, MKV_A_AAC)) 1904 track->a_formattag = mmioFOURCC('M', 'P', '4', 'A'); 1905 else if (!strcmp(track->codec_id, MKV_A_VORBIS)) 1906 { 1907 if (track->private_data == NULL) 1908 return 1; 1909 track->a_formattag = mmioFOURCC('v', 'r', 'b', 's'); 1910 } 1911 else if (!strcmp(track->codec_id, MKV_A_QDMC)) 1912 track->a_formattag = mmioFOURCC('Q', 'D', 'M', 'C'); 1913 else if (!strcmp(track->codec_id, MKV_A_QDMC2)) 1914 track->a_formattag = mmioFOURCC('Q', 'D', 'M', '2'); 1915 else if (!strcmp(track->codec_id, MKV_A_FLAC)) 1916 { 1917 if (track->private_data == NULL || track->private_size == 0) 1918 { 1919 dprintf ( "[mkv] FLAC track does not " 1920 "contain valid headers.\n"); 1921 return 1; 1922 } 1923 track->a_formattag = mmioFOURCC ('f', 'L', 'a', 'C'); 1924 } 1925 else if (track->private_size >= sizeof (real_audio_v4_props_t)) 1926 { 1927 if (!strcmp(track->codec_id, MKV_A_REAL28)) 1928 track->a_formattag = mmioFOURCC('2', '8', '_', '8'); 1929 else if (!strcmp(track->codec_id, MKV_A_REALATRC)) 1930 track->a_formattag = mmioFOURCC('a', 't', 'r', 'c'); 1931 else if (!strcmp(track->codec_id, MKV_A_REALCOOK)) 1932 track->a_formattag = mmioFOURCC('c', 'o', 'o', 'k'); 1933 else if (!strcmp(track->codec_id, MKV_A_REALDNET)) 1934 track->a_formattag = mmioFOURCC('d', 'n', 'e', 't'); 1935 else if (!strcmp(track->codec_id, MKV_A_REALSIPR)) 1936 track->a_formattag = mmioFOURCC('s', 'i', 'p', 'r'); 1937 } 1938 else 1939 { 1940 dprintf ( "[mkv] Unknown/unsupported audio " 1941 "codec ID '%s' for track %u or missing/faulty private " 1942 "codec data.\n", track->codec_id, track->tnum); 1943 free_sh_audio (sh_a); 1944 return 1; 1945 } 1946 } 1947 1948 sh_a->format = track->a_formattag; 1949 sh_a->wf->wFormatTag = track->a_formattag; 1950 sh_a->channels = track->a_channels; 1951 sh_a->wf->nChannels = track->a_channels; 1952 sh_a->samplerate = (uint32_t) track->a_sfreq; 1953 sh_a->wf->nSamplesPerSec = (uint32_t) track->a_sfreq; 1954 if (track->a_bps == 0) 1955 { 1956 sh_a->samplesize = 2; 1957 sh_a->wf->wBitsPerSample = 16; 1958 } 1959 else 1960 { 1961 sh_a->samplesize = track->a_bps / 8; 1962 sh_a->wf->wBitsPerSample = track->a_bps; 1963 } 1964 if (track->a_formattag == 0x0055) /* MP3 || MP2 */ 1965 { 1966 sh_a->wf->nAvgBytesPerSec = 16000; 1967 sh_a->wf->nBlockAlign = 1152; 1968 } 1969 else if ((track->a_formattag == 0x2000) || /* AC3 */ 1970 (track->a_formattag == 0x2001)) /* DTS */ 1971 { 1972 sh_a->wf->nAvgBytesPerSec = 16000; 1973 sh_a->wf->nBlockAlign = 1536; 1974 } 1975 else if (track->a_formattag == 0x0001) /* PCM || PCM_BE */ 1976 { 1977 sh_a->wf->nAvgBytesPerSec = sh_a->channels * sh_a->samplerate*2; 1978 sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec; 1979 if (!strcmp(track->codec_id, MKV_A_PCM_BE)) 1980 sh_a->format = mmioFOURCC('t', 'w', 'o', 's'); 1981 } 1982 else if (!strcmp(track->codec_id, MKV_A_QDMC) || 1983 !strcmp(track->codec_id, MKV_A_QDMC2)) 1984 { 1985 sh_a->wf->nAvgBytesPerSec = 16000; 1986 sh_a->wf->nBlockAlign = 1486; 1987 track->fix_i_bps = 1; 1988 track->qt_last_a_pts = 0.0; 1989 if (track->private_data != NULL) 1990 { 1991 sh_a->codecdata=(unsigned char *)malloc(track->private_size); 1992 memcpy (sh_a->codecdata, track->private_data, 1993 track->private_size); 1994 sh_a->codecdata_len = track->private_size; 1995 } 1996 } 1997 else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A')) 1998 { 1999 int profile, srate_idx; 2000 2001 sh_a->wf->nAvgBytesPerSec = 16000; 2002 sh_a->wf->nBlockAlign = 1024; 2003 2004 if (!strcmp (track->codec_id, MKV_A_AAC) && 2005 (NULL != track->private_data)) 2006 { 2007 sh_a->codecdata=(unsigned char *)malloc(track->private_size); 2008 memcpy (sh_a->codecdata, track->private_data, 2009 track->private_size); 2010 sh_a->codecdata_len = track->private_size; 2011 return 0; 2012 } 2013 2014 /* Recreate the 'private data' */ 2015 /* which faad2 uses in its initialization */ 2016 srate_idx = aac_get_sample_rate_index (sh_a->samplerate); 2017 if (!strncmp (&track->codec_id[12], "MAIN", 4)) 2018 profile = 0; 2019 else if (!strncmp (&track->codec_id[12], "LC", 2)) 2020 profile = 1; 2021 else if (!strncmp (&track->codec_id[12], "SSR", 3)) 2022 profile = 2; 2023 else 2024 profile = 3; 2025 sh_a->codecdata = (unsigned char *) malloc (5); 2026 sh_a->codecdata[0] = ((profile+1) << 3) | ((srate_idx&0xE) >> 1); 2027 sh_a->codecdata[1] = ((srate_idx&0x1)<<7)|(track->a_channels<<3); 2028 2029 if (strstr(track->codec_id, "SBR") != NULL) 2030 { 2031 /* HE-AAC (aka SBR AAC) */ 2032 sh_a->codecdata_len = 5; 2033 2034 sh_a->samplerate *= 2; 2035 sh_a->wf->nSamplesPerSec *= 2; 2036 srate_idx = aac_get_sample_rate_index(sh_a->samplerate); 2037 sh_a->codecdata[2] = AAC_SYNC_EXTENSION_TYPE >> 3; 2038 sh_a->codecdata[3] = ((AAC_SYNC_EXTENSION_TYPE&0x07)<<5) | 5; 2039 sh_a->codecdata[4] = (1 << 7) | (srate_idx << 3); 2040 track->default_duration = 1024.0 / (sh_a->samplerate / 2); 2041 } 2042 else 2043 { 2044 sh_a->codecdata_len = 2; 2045 track->default_duration = 1024.0 / (float)sh_a->samplerate; 2046 } 2047 } 2048 else if (track->a_formattag == mmioFOURCC('v', 'r', 'b', 's')) /* VORBIS */ 2049 { 2050 sh_a->wf->cbSize = track->private_size; 2051 sh_a->wf = (WAVEFORMATEX*)realloc(sh_a->wf, sizeof(WAVEFORMATEX) + sh_a->wf->cbSize); 2052 memcpy((unsigned char *) (sh_a->wf+1), track->private_data, sh_a->wf->cbSize); 2053 } 2054 else if (track->private_size >= sizeof(real_audio_v4_props_t) 2055 && !strncmp (track->codec_id, MKV_A_REALATRC, 7)) 2056 { 2057 /* Common initialization for all RealAudio codecs */ 2058 real_audio_v4_props_t *ra4p; 2059 real_audio_v5_props_t *ra5p; 2060 unsigned char *src; 2061 int codecdata_length, version; 2062 2063 ra4p = (real_audio_v4_props_t *) track->private_data; 2064 ra5p = (real_audio_v5_props_t *) track->private_data; 2065 2066 sh_a->wf->nAvgBytesPerSec = 0; /* FIXME !? */ 2067 sh_a->wf->nBlockAlign = be2me_16 (ra4p->frame_size); 2068 2069 version = be2me_16 (ra4p->version1); 2070 2071 if (version == 4) 2072 { 2073 src = (unsigned char *) (ra4p + 1); 2074 src += src[0] + 1; 2075 src += src[0] + 1; 2076 track->sub_packet_size = be2me_16 (ra4p->sub_packet_size); 2077 track->sub_packet_h = be2me_16 (ra4p->sub_packet_h); 2078 track->coded_framesize = be2me_32 (ra4p->coded_frame_size); 2079 track->audiopk_size = be2me_16 (ra4p->frame_size); 2080 } 2081 else 2082 { 2083 src = (unsigned char *) (ra5p + 1); 2084 track->sub_packet_size = be2me_16 (ra5p->sub_packet_size); 2085 track->sub_packet_h = be2me_16 (ra5p->sub_packet_h); 2086 track->coded_framesize = be2me_32 (ra5p->coded_frame_size); 2087 track->audiopk_size = be2me_16 (ra5p->frame_size); 2088 } 2089 2090 src += 3; 2091 if (version == 5) 2092 src++; 2093 codecdata_length = be2me_32 (*(uint32_t *)src); 2094 src += 4; 2095 sh_a->wf->cbSize = codecdata_length; 2096 sh_a->wf = (WAVEFORMATEX *) realloc (sh_a->wf, 2097 sizeof (WAVEFORMATEX) + 2098 sh_a->wf->cbSize); 2099 memcpy(((char *)(sh_a->wf + 1)), src, codecdata_length); 2100 2101 switch (track->a_formattag) { 2067 track->a_formattag = mmioFOURCC ('f', 'L', 'a', 'C'); 2068 } 2069 else if (track->private_size >= sizeof (real_audio_v4_props_t)) 2070 { 2071 if (!strcmp(track->codec_id, MKV_A_REAL28)) 2072 track->a_formattag = mmioFOURCC('2', '8', '_', '8'); 2073 else if (!strcmp(track->codec_id, MKV_A_REALATRC)) 2074 track->a_formattag = mmioFOURCC('a', 't', 'r', 'c'); 2075 else if (!strcmp(track->codec_id, MKV_A_REALCOOK)) 2076 track->a_formattag = mmioFOURCC('c', 'o', 'o', 'k'); 2077 else if (!strcmp(track->codec_id, MKV_A_REALDNET)) 2078 track->a_formattag = mmioFOURCC('d', 'n', 'e', 't'); 2079 else if (!strcmp(track->codec_id, MKV_A_REALSIPR)) 2080 track->a_formattag = mmioFOURCC('s', 'i', 'p', 'r'); 2081 } 2082 else 2083 { 2084 dprintf( MSGTR_MPDEMUX_MKV_UnknownAudioCodec, 2085 track->codec_id, track->tnum); 2086 free_sh_audio(demuxer, track->tnum); 2087 return 1; 2088 } 2089 } 2090 2091 sh_a->format = track->a_formattag; 2092 sh_a->wf->wFormatTag = track->a_formattag; 2093 sh_a->channels = track->a_channels; 2094 sh_a->wf->nChannels = track->a_channels; 2095 sh_a->samplerate = (uint32_t) track->a_sfreq; 2096 sh_a->wf->nSamplesPerSec = (uint32_t) track->a_sfreq; 2097 if (track->a_bps == 0) 2098 { 2099 sh_a->samplesize = 2; 2100 sh_a->wf->wBitsPerSample = 16; 2101 } 2102 else 2103 { 2104 sh_a->samplesize = track->a_bps / 8; 2105 sh_a->wf->wBitsPerSample = track->a_bps; 2106 } 2107 if (track->a_formattag == 0x0055) /* MP3 || MP2 */ 2108 { 2109 sh_a->wf->nAvgBytesPerSec = 16000; 2110 sh_a->wf->nBlockAlign = 1152; 2111 } 2112 else if ((track->a_formattag == 0x2000) || /* AC3 */ 2113 (track->a_formattag == 0x2001)) /* DTS */ 2114 { 2115 sh_a->wf->nAvgBytesPerSec = 16000; 2116 sh_a->wf->nBlockAlign = 1536; 2117 } 2118 else if (track->a_formattag == 0x0001) /* PCM || PCM_BE */ 2119 { 2120 sh_a->wf->nAvgBytesPerSec = sh_a->channels * sh_a->samplerate*2; 2121 sh_a->wf->nBlockAlign = sh_a->wf->nAvgBytesPerSec; 2122 if (!strcmp(track->codec_id, MKV_A_PCM_BE)) 2123 sh_a->format = mmioFOURCC('t', 'w', 'o', 's'); 2124 } 2125 else if (!strcmp(track->codec_id, MKV_A_QDMC) || 2126 !strcmp(track->codec_id, MKV_A_QDMC2)) 2127 { 2128 sh_a->wf->nAvgBytesPerSec = 16000; 2129 sh_a->wf->nBlockAlign = 1486; 2130 track->fix_i_bps = 1; 2131 track->qt_last_a_pts = 0.0; 2132 if (track->private_data != NULL) 2133 { 2134 sh_a->codecdata=malloc(track->private_size); 2135 memcpy (sh_a->codecdata, track->private_data, 2136 track->private_size); 2137 sh_a->codecdata_len = track->private_size; 2138 } 2139 } 2140 else if (track->a_formattag == mmioFOURCC('M', 'P', '4', 'A')) 2141 { 2142 int profile, srate_idx; 2143 2144 sh_a->wf->nAvgBytesPerSec = 16000; 2145 sh_a->wf->nBlockAlign = 1024; 2146 2147 if (!strcmp (track->codec_id, MKV_A_AAC) && 2148 (NULL != track->private_data)) 2149 { 2150 sh_a->codecdata=malloc(track->private_size); 2151 memcpy (sh_a->codecdata, track->private_data, 2152 track->private_size); 2153 sh_a->codecdata_len = track->private_size; 2154 return 0; 2155 } 2156 2157 /* Recreate the 'private data' */ 2158 /* which faad2 uses in its initialization */ 2159 srate_idx = aac_get_sample_rate_index (sh_a->samplerate); 2160 if (!strncmp (&track->codec_id[12], "MAIN", 4)) 2161 profile = 0; 2162 else if (!strncmp (&track->codec_id[12], "LC", 2)) 2163 profile = 1; 2164 else if (!strncmp (&track->codec_id[12], "SSR", 3)) 2165 profile = 2; 2166 else 2167 profile = 3; 2168 sh_a->codecdata = malloc (5); 2169 sh_a->codecdata[0] = ((profile+1) << 3) | ((srate_idx&0xE) >> 1); 2170 sh_a->codecdata[1] = ((srate_idx&0x1)<<7)|(track->a_channels<<3); 2171 2172 if (strstr(track->codec_id, "SBR") != NULL) 2173 { 2174 /* HE-AAC (aka SBR AAC) */ 2175 sh_a->codecdata_len = 5; 2176 2177 sh_a->samplerate *= 2; 2178 sh_a->wf->nSamplesPerSec *= 2; 2179 srate_idx = aac_get_sample_rate_index(sh_a->samplerate); 2180 sh_a->codecdata[2] = AAC_SYNC_EXTENSION_TYPE >> 3; 2181 sh_a->codecdata[3] = ((AAC_SYNC_EXTENSION_TYPE&0x07)<<5) | 5; 2182 sh_a->codecdata[4] = (1 << 7) | (srate_idx << 3); 2183 track->default_duration = 1024.0 / (sh_a->samplerate / 2); 2184 } 2185 else 2186 { 2187 sh_a->codecdata_len = 2; 2188 track->default_duration = 1024.0 / (float)sh_a->samplerate; 2189 } 2190 } 2191 else if (track->a_formattag == mmioFOURCC('v', 'r', 'b', 's')) /* VORBIS */ 2192 { 2193 sh_a->wf->cbSize = track->private_size; 2194 sh_a->wf = realloc(sh_a->wf, sizeof(WAVEFORMATEX) + sh_a->wf->cbSize); 2195 memcpy((unsigned char *) (sh_a->wf+1), track->private_data, sh_a->wf->cbSize); 2196 } 2197 else if (track->private_size >= sizeof(real_audio_v4_props_t) 2198 && !strncmp (track->codec_id, MKV_A_REALATRC, 7)) 2199 { 2200 /* Common initialization for all RealAudio codecs */ 2201 real_audio_v4_props_t *ra4p; 2202 real_audio_v5_props_t *ra5p; 2203 unsigned char *src; 2204 int codecdata_length, version; 2205 2206 ra4p = (real_audio_v4_props_t *) track->private_data; 2207 ra5p = (real_audio_v5_props_t *) track->private_data; 2208 2209 sh_a->wf->nAvgBytesPerSec = 0; /* FIXME !? */ 2210 sh_a->wf->nBlockAlign = be2me_16 (ra4p->frame_size); 2211 2212 version = be2me_16 (ra4p->version1); 2213 2214 if (version == 4) 2215 { 2216 src = (unsigned char *) (ra4p + 1); 2217 src += src[0] + 1; 2218 src += src[0] + 1; 2219 track->sub_packet_size = be2me_16 (ra4p->sub_packet_size); 2220 track->sub_packet_h = be2me_16 (ra4p->sub_packet_h); 2221 track->coded_framesize = be2me_32 (ra4p->coded_frame_size); 2222 track->audiopk_size = be2me_16 (ra4p->frame_size); 2223 } 2224 else 2225 { 2226 src = (unsigned char *) (ra5p + 1); 2227 track->sub_packet_size = be2me_16 (ra5p->sub_packet_size); 2228 track->sub_packet_h = be2me_16 (ra5p->sub_packet_h); 2229 track->coded_framesize = be2me_32 (ra5p->coded_frame_size); 2230 track->audiopk_size = be2me_16 (ra5p->frame_size); 2231 } 2232 2233 src += 3; 2234 if (version == 5) 2235 src++; 2236 codecdata_length = be2me_32 (*(uint32_t *)src); 2237 src += 4; 2238 sh_a->wf->cbSize = codecdata_length; 2239 sh_a->wf = realloc (sh_a->wf, 2240 sizeof (WAVEFORMATEX) + 2241 sh_a->wf->cbSize); 2242 memcpy(((char *)(sh_a->wf + 1)), src, codecdata_length); 2243 2244 switch (track->a_formattag) { 2102 2245 case mmioFOURCC('a', 't', 'r', 'c'): 2103 2104 2105 2106 2107 2246 sh_a->wf->nAvgBytesPerSec = atrc_fl2bps[be2me_16 (ra4p->flavor)]; 2247 sh_a->wf->nBlockAlign = track->sub_packet_size; 2248 track->audio_buf = malloc(track->sub_packet_h * track->audiopk_size); 2249 track->audio_timestamp = malloc(track->sub_packet_h * sizeof(float)); 2250 break; 2108 2251 case mmioFOURCC('c', 'o', 'o', 'k'): 2109 2110 2111 2112 2113 2252 sh_a->wf->nAvgBytesPerSec = cook_fl2bps[be2me_16 (ra4p->flavor)]; 2253 sh_a->wf->nBlockAlign = track->sub_packet_size; 2254 track->audio_buf = malloc(track->sub_packet_h * track->audiopk_size); 2255 track->audio_timestamp = malloc(track->sub_packet_h * sizeof(float)); 2256 break; 2114 2257 case mmioFOURCC('s', 'i', 'p', 'r'): 2115 2116 2117 2118 2119 2258 sh_a->wf->nAvgBytesPerSec = sipr_fl2bps[be2me_16 (ra4p->flavor)]; 2259 sh_a->wf->nBlockAlign = track->coded_framesize; 2260 track->audio_buf = malloc(track->sub_packet_h * track->audiopk_size); 2261 track->audio_timestamp = malloc(track->sub_packet_h * sizeof(float)); 2262 break; 2120 2263 case mmioFOURCC('2', '8', '_', '8'): 2121 2122 2123 2124 2125 2126 2127 2128 2129 } 2130 2131 2132 { 2133 2134 2135 2136 2137 2138 2139 { 2140 2141 2142 } 2143 2144 { 2145 2146 2147 2148 2149 } 2150 2151 2152 { 2153 2154 2155 } 2156 2157 { 2158 2159 2160 } 2161 2162 2163 2164 } 2165 2166 { 2167 free_sh_audio (sh_a);2168 2169 } 2170 2171 2264 sh_a->wf->nAvgBytesPerSec = 3600; 2265 sh_a->wf->nBlockAlign = track->coded_framesize; 2266 track->audio_buf = malloc(track->sub_packet_h * track->audiopk_size); 2267 track->audio_timestamp = malloc(track->sub_packet_h * sizeof(float)); 2268 break; 2269 } 2270 2271 track->realmedia = 1; 2272 } 2273 else if (!strcmp(track->codec_id, MKV_A_FLAC) || 2274 (track->a_formattag == 0xf1ac)) 2275 { 2276 unsigned char *ptr; 2277 int size; 2278 free(sh_a->wf); 2279 sh_a->wf = NULL; 2280 2281 if (track->a_formattag == mmioFOURCC('f', 'L', 'a', 'C')) 2282 { 2283 ptr = (unsigned char *)track->private_data; 2284 size = track->private_size; 2285 } 2286 else 2287 { 2288 sh_a->format = mmioFOURCC('f', 'L', 'a', 'C'); 2289 ptr = (unsigned char *) track->private_data 2290 + sizeof (WAVEFORMATEX); 2291 size = track->private_size - sizeof (WAVEFORMATEX); 2292 } 2293 if (size < 4 || ptr[0] != 'f' || ptr[1] != 'L' || 2294 ptr[2] != 'a' || ptr[3] != 'C') 2295 { 2296 dp = new_demux_packet (4); 2297 memcpy (dp->buffer, "fLaC", 4); 2298 } 2299 else 2300 { 2301 dp = new_demux_packet (size); 2302 memcpy (dp->buffer, ptr, size); 2303 } 2304 dp->pts = 0; 2305 dp->flags = 0; 2306 ds_add_packet (demuxer->audio, dp); 2307 } 2308 else if (!track->ms_compat || (track->private_size < sizeof(WAVEFORMATEX))) 2309 { 2310 free_sh_audio(demuxer, track->tnum); 2311 return 1; 2312 } 2313 2314 return 0; 2172 2315 } 2173 2316 2174 2317 /** \brief Parse the private data for VobSub subtitle tracks. 2175 2318 2176 This function tries to parse the private data for all VobSub tracks.2177 The private data contains the normal text from the original .idx file.2178 Things like the palette, subtitle dimensions and custom colors are2179 stored here.2180 2181 \param demuxer The generic demuxer.2319 This function tries to parse the private data for all VobSub tracks. 2320 The private data contains the normal text from the original .idx file. 2321 Things like the palette, subtitle dimensions and custom colors are 2322 stored here. 2323 2324 \param demuxer The generic demuxer. 2182 2325 */ 2183 2326 static void 2184 2327 demux_mkv_parse_vobsub_data (demuxer_t *demuxer) 2185 2328 { 2186 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 2187 mkv_track_t *track; 2188 int i, m, size; 2189 uint8_t *buffer; 2190 2191 for (i = 0; i < mkv_d->num_tracks; i++) 2192 { 2193 track = mkv_d->tracks[i]; 2194 if ((track->type != MATROSKA_TRACK_SUBTITLE) || 2195 (track->subtitle_type != MATROSKA_SUBTYPE_VOBSUB)) 2196 continue; 2197 2198 size = track->private_size; 2199 m = demux_mkv_decode (track,track->private_data,&buffer,&size,2); 2200 if (buffer && m) 2201 { 2202 free (track->private_data); 2203 track->private_data = buffer; 2204 track->private_size = size; 2205 } 2206 if (!demux_mkv_parse_idx (track)) 2207 { 2208 free (track->private_data); 2209 track->private_data = NULL; 2210 track->private_size = 0; 2211 } 2212 } 2213 } 2329 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 2330 mkv_track_t *track; 2331 int i, m, size; 2332 uint8_t *buffer; 2333 2334 for (i = 0; i < mkv_d->num_tracks; i++) 2335 { 2336 track = mkv_d->tracks[i]; 2337 if ((track->type != MATROSKA_TRACK_SUBTITLE) || 2338 (track->subtitle_type != MATROSKA_SUBTYPE_VOBSUB)) 2339 continue; 2340 2341 size = track->private_size; 2342 m = demux_mkv_decode (track,track->private_data,&buffer,&size,2); 2343 if (buffer && m) 2344 { 2345 free (track->private_data); 2346 track->private_data = buffer; 2347 track->private_size = size; 2348 } 2349 if (!demux_mkv_parse_idx (track)) 2350 { 2351 free (track->private_data); 2352 track->private_data = NULL; 2353 track->private_size = 0; 2354 } 2355 } 2356 } 2357 2358 /** \brief Parse the private data for SSA/ASS subtitle tracks. 2359 2360 This function tries to parse the private data for all SSA/ASS tracks. 2361 The private data contains the normal text from the original script, 2362 from the start to the beginning of 'Events' section, including '[Events]' line. 2363 2364 \param demuxer The generic demuxer. 2365 */ 2366 #ifdef USE_ASS 2367 static void 2368 demux_mkv_parse_ass_data (demuxer_t *demuxer) 2369 { 2370 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 2371 mkv_track_t *track; 2372 int i, m, size; 2373 uint8_t *buffer; 2374 2375 for (i = 0; i < mkv_d->num_tracks; i++) 2376 { 2377 track = mkv_d->tracks[i]; 2378 if (track->type != MATROSKA_TRACK_SUBTITLE) 2379 continue; 2380 2381 track->sh_sub.type = 'a'; 2382 2383 if (track->subtitle_type == MATROSKA_SUBTYPE_SSA) 2384 { 2385 track->sh_sub.ass_track = ass_new_track(ass_library); 2386 size = track->private_size; 2387 m = demux_mkv_decode (track,track->private_data,&buffer,&size,2); 2388 if (buffer && m) 2389 { 2390 free (track->private_data); 2391 track->private_data = buffer; 2392 track->private_size = size; 2393 } 2394 ass_process_codec_private(track->sh_sub.ass_track, track->private_data, track->private_size); 2395 } 2396 else 2397 { 2398 track->sh_sub.ass_track = ass_default_track(ass_library); 2399 } 2400 } 2401 } 2402 #endif 2214 2403 2215 2404 static int 2216 demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track) 2217 { 2218 if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN) 2219 { 2220 if (track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB) 2221 { 2222 if (track->private_data != NULL) 2405 demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track, int sid) 2406 { 2407 if (track->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN) 2408 { 2409 sh_sub_t *sh = new_sh_sub_sid(demuxer, track->tnum, sid); 2410 if ((track->subtitle_type == MATROSKA_SUBTYPE_VOBSUB) || 2411 (track->subtitle_type == MATROSKA_SUBTYPE_SSA)) 2412 { 2413 if (track->private_data != NULL) 2223 2414 { 2224 demuxer->sub->sh = malloc(sizeof(mkv_sh_sub_t)); 2225 if (demuxer->sub->sh != NULL) 2226 memcpy(demuxer->sub->sh, &track->sh_sub, sizeof(mkv_sh_sub_t)); 2415 if (sh) 2416 memcpy(sh, &track->sh_sub, sizeof(sh_sub_t)); 2227 2417 } 2228 2418 } 2229 2419 } 2230 2231 { 2232 dprintf ("[mkv] Subtitle type '%s' is not "2233 "supported.\n",track->codec_id);2234 2235 } 2236 2237 2238 } 2239 2240 static void demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, /*float audio_delay, */int flags);2420 else 2421 { 2422 dprintf(MSGTR_MPDEMUX_MKV_SubtitleTypeNotSupported, 2423 track->codec_id); 2424 return 1; 2425 } 2426 2427 return 0; 2428 } 2429 2430 static void demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags); 2241 2431 2242 2432 /** \brief Given a matroska track number and type, find the id that mplayer would ask for. … … 2247 2437 static int demux_mkv_reverse_id(mkv_demuxer_t *d, int num, int type) 2248 2438 { 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2439 int i, id; 2440 2441 for (i=0, id=0; i < d->num_tracks; i++) 2442 if (d->tracks[i] != NULL && d->tracks[i]->type == type) { 2443 if (d->tracks[i]->tnum == num) 2444 return id; 2445 id++; 2446 } 2447 2448 return -1; 2259 2449 } 2260 2450 … … 2262 2452 demux_mkv_open (demuxer_t *demuxer) 2263 2453 { 2264 2265 2266 2267 2268 2454 stream_t *s = demuxer->stream; 2455 mkv_demuxer_t *mkv_d; 2456 mkv_track_t *track; 2457 int i, version, cont = 0; 2458 char *str; 2269 2459 2270 2460 #ifdef USE_ICONV 2271 2461 subcp_open(NULL); 2272 2462 #endif 2273 2463 2274 stream_seek(s, s->start_pos); 2275 str = ebml_read_header (s, &version); 2276 if (str == NULL || strcmp (str, "matroska") || version > 2) 2277 { 2278 dprintf ( "[mkv] no head found\n"); 2279 return 0; 2280 } 2281 free (str); 2282 2283 dprintf ("[mkv] Found the head...\n"); 2284 2285 if (ebml_read_id (s, NULL) != MATROSKA_ID_SEGMENT) 2286 { 2287 dprintf ("[mkv] but no segment :(\n"); 2288 return 0; 2289 } 2290 ebml_read_length (s, NULL); /* return bytes number until EOF */ 2291 2292 dprintf ("[mkv] + a segment...\n"); 2293 2294 demux_aid_vid_mismatch = 1; // don't identify in new_sh_* since ids don't match 2295 2296 mkv_d = (mkv_demuxer_t *) malloc (sizeof (mkv_demuxer_t)); 2297 memset (mkv_d, 0, sizeof(mkv_demuxer_t)); 2298 demuxer->priv = mkv_d; 2299 mkv_d->tc_scale = 1000000; 2300 mkv_d->segment_start = stream_tell (s); 2301 mkv_d->parsed_cues = (off_t *) malloc (sizeof (off_t)); 2302 mkv_d->parsed_seekhead = (off_t *) malloc (sizeof (off_t)); 2303 2304 for (i=0; i < SUB_MAX_TEXT; i++) 2305 mkv_d->subs.text[i] = (char *) malloc (256); 2306 2307 while (!cont) 2308 { 2309 switch (ebml_read_id (s, NULL)) 2464 stream_seek(s, s->start_pos); 2465 str = ebml_read_header (s, &version); 2466 if (str == NULL || strcmp (str, "matroska") || version > 2) 2467 { 2468 dprintf("[mkv] no head found\n"); 2469 return 0; 2470 } 2471 free (str); 2472 2473 dprintf("[mkv] Found the head...\n"); 2474 2475 if (ebml_read_id (s, NULL) != MATROSKA_ID_SEGMENT) 2476 { 2477 dprintf("[mkv] but no segment :(\n"); 2478 return 0; 2479 } 2480 ebml_read_length (s, NULL); /* return bytes number until EOF */ 2481 2482 dprintf("[mkv] + a segment...\n"); 2483 2484 mkv_d = calloc (1, sizeof (mkv_demuxer_t)); 2485 demuxer->priv = mkv_d; 2486 mkv_d->tc_scale = 1000000; 2487 mkv_d->segment_start = stream_tell (s); 2488 mkv_d->parsed_cues = malloc (sizeof (off_t)); 2489 mkv_d->parsed_seekhead = malloc (sizeof (off_t)); 2490 2491 for (i=0; i < SUB_MAX_TEXT; i++) 2492 mkv_d->subs.text[i] = malloc (256); 2493 2494 while (!cont) 2495 { 2496 switch (ebml_read_id (s, NULL)) 2310 2497 { 2311 2498 case MATROSKA_ID_INFO: 2312 dprintf ("[mkv] |+ segment information...\n"); 2313 cont = demux_mkv_read_info (demuxer); 2499 dprintf("[mkv] |+ segment information...\n"); 2500 cont = demux_mkv_read_info (demuxer); 2501 break; 2502 2503 case MATROSKA_ID_TRACKS: 2504 dprintf("[mkv] |+ segment tracks...\n"); 2505 cont = demux_mkv_read_tracks (demuxer); 2506 break; 2507 2508 case MATROSKA_ID_CUES: 2509 cont = demux_mkv_read_cues (demuxer); 2510 break; 2511 2512 case MATROSKA_ID_TAGS: 2513 cont = demux_mkv_read_tags (demuxer); 2514 break; 2515 2516 case MATROSKA_ID_SEEKHEAD: 2517 cont = demux_mkv_read_seekhead (demuxer); 2518 break; 2519 2520 case MATROSKA_ID_CHAPTERS: 2521 cont = demux_mkv_read_chapters (demuxer); 2522 break; 2523 2524 case MATROSKA_ID_ATTACHMENTS: 2525 cont = demux_mkv_read_attachments (demuxer); 2526 break; 2527 2528 case MATROSKA_ID_CLUSTER: 2529 { 2530 int p, l; 2531 dprintf("[mkv] |+ found cluster, headers are " 2532 "parsed completely :)\n"); 2533 /* get the first cluster timecode */ 2534 p = stream_tell(s); 2535 l = ebml_read_length (s, NULL); 2536 while (ebml_read_id (s, NULL) != MATROSKA_ID_CLUSTERTIMECODE) 2537 { 2538 ebml_read_skip (s, NULL); 2539 if (stream_tell (s) >= p + l) 2540 break; 2541 } 2542 if (stream_tell (s) < p + l) 2543 { 2544 uint64_t num = ebml_read_uint (s, NULL); 2545 if (num == EBML_UINT_INVALID) 2546 return 0; 2547 mkv_d->first_tc = num * mkv_d->tc_scale / 1000000.0; 2548 mkv_d->has_first_tc = 1; 2549 } 2550 stream_seek (s, p - 4); 2551 cont = 1; 2314 2552 break; 2315 2316 case MATROSKA_ID_TRACKS: 2317 dprintf ("[mkv] |+ segment tracks...\n"); 2318 cont = demux_mkv_read_tracks (demuxer); 2553 } 2554 2555 default: 2556 cont = 1; 2557 case EBML_ID_VOID: 2558 ebml_read_skip (s, NULL); 2559 break; 2560 } 2561 } 2562 2563 display_create_tracks (demuxer); 2564 2565 /* select video track */ 2566 track = NULL; 2567 if (demuxer->video->id == -1) /* automatically select a video track */ 2568 { 2569 /* search for a video track that has the 'default' flag set */ 2570 for (i=0; i<mkv_d->num_tracks; i++) 2571 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO 2572 && mkv_d->tracks[i]->default_track) 2573 { 2574 track = mkv_d->tracks[i]; 2319 2575 break; 2320 2321 case MATROSKA_ID_CUES: 2322 cont = demux_mkv_read_cues (demuxer); 2576 } 2577 2578 if (track == NULL) 2579 /* no track has the 'default' flag set */ 2580 /* let's take the first video track */ 2581 for (i=0; i<mkv_d->num_tracks; i++) 2582 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO) 2583 { 2584 track = mkv_d->tracks[i]; 2585 break; 2586 } 2587 } 2588 else if (demuxer->video->id != -2) /* -2 = no video at all */ 2589 track = demux_mkv_find_track_by_num (mkv_d, demuxer->video->id, 2590 MATROSKA_TRACK_VIDEO); 2591 2592 if (track && demuxer->v_streams[track->tnum]) 2593 { 2594 dprintf( 2595 MSGTR_MPDEMUX_MKV_WillPlayVideoTrack, track->tnum); 2596 demuxer->video->id = track->tnum; 2597 demuxer->video->sh = demuxer->v_streams[track->tnum]; 2598 } 2599 else 2600 { 2601 dprintf( MSGTR_MPDEMUX_MKV_NoVideoTrackFound); 2602 demuxer->video->id = -2; 2603 } 2604 2605 /* select audio track */ 2606 track = NULL; 2607 if (demuxer->audio->id == -1) /* automatically select an audio track */ 2608 { 2609 /* check if the user specified an audio language */ 2610 if (audio_lang != NULL) 2611 track = demux_mkv_find_track_by_language(mkv_d, audio_lang, 2612 MATROSKA_TRACK_AUDIO); 2613 if (track == NULL) 2614 /* no audio language specified, or language not found */ 2615 /* search for an audio track that has the 'default' flag set */ 2616 for (i=0; i < mkv_d->num_tracks; i++) 2617 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO 2618 && mkv_d->tracks[i]->default_track) 2619 { 2620 track = mkv_d->tracks[i]; 2621 break; 2622 } 2623 2624 if (track == NULL) 2625 /* no track has the 'default' flag set */ 2626 /* let's take the first audio track */ 2627 for (i=0; i < mkv_d->num_tracks; i++) 2628 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO) 2629 { 2630 track = mkv_d->tracks[i]; 2631 break; 2632 } 2633 } 2634 else if (demuxer->audio->id != -2) /* -2 = no audio at all */ 2635 track = demux_mkv_find_track_by_num (mkv_d, demuxer->audio->id, 2636 MATROSKA_TRACK_AUDIO); 2637 else 2638 { 2639 dprintf( MSGTR_MPDEMUX_MKV_NoAudioTrackFound); 2640 demuxer->audio->id = -2; 2641 } 2642 2643 2644 if(demuxer->audio->id != -2) 2645 for (i=0; i < mkv_d->num_tracks; i++) 2646 { 2647 if(mkv_d->tracks[i]->type != MATROSKA_TRACK_AUDIO) 2648 continue; 2649 if(demuxer->a_streams[track->tnum]) 2650 { 2651 if(track && mkv_d->tracks[i] == track) 2652 { 2653 demuxer->audio->id = track->tnum; 2654 demuxer->audio->sh = demuxer->a_streams[track->tnum]; 2655 } 2656 mkv_d->last_aid++; 2657 if(mkv_d->last_aid == MAX_A_STREAMS) 2323 2658 break; 2324 2325 case MATROSKA_ID_TAGS: 2326 cont = demux_mkv_read_tags (demuxer); 2327 break; 2328 2329 case MATROSKA_ID_SEEKHEAD: 2330 cont = demux_mkv_read_seekhead (demuxer); 2331 break; 2332 2333 case MATROSKA_ID_CHAPTERS: 2334 cont = demux_mkv_read_chapters (demuxer); 2335 break; 2336 2337 case MATROSKA_ID_CLUSTER: 2659 } 2660 } 2661 2662 demux_mkv_parse_vobsub_data (demuxer); 2663 #ifdef USE_ASS 2664 if (ass_enabled) 2665 demux_mkv_parse_ass_data (demuxer); 2666 #endif 2667 /* DO NOT automatically select a subtitle track and behave like DVD */ 2668 /* playback: only show subtitles if the user explicitely wants them. */ 2669 track = NULL; 2670 if (demuxer->sub->id >= 0) 2671 track = demux_mkv_find_track_by_num (mkv_d, demuxer->sub->id, 2672 MATROSKA_TRACK_SUBTITLE); 2673 else if (dvdsub_lang != NULL) 2674 track = demux_mkv_find_track_by_language (mkv_d, dvdsub_lang, 2675 MATROSKA_TRACK_SUBTITLE); 2676 2677 if (track) 2678 { 2679 dprintf(MSGTR_MPDEMUX_MKV_WillDisplaySubtitleTrack, track->tnum); 2680 dvdsub_id = demux_mkv_reverse_id(mkv_d, track->tnum, MATROSKA_TRACK_SUBTITLE); 2681 demuxer->sub->id = track->tnum; 2682 } 2683 else 2684 demuxer->sub->id = -2; 2685 2686 if (demuxer->chapters) 2687 { 2688 for (i=0; i < (int)demuxer->num_chapters; i++) 2689 { 2690 demuxer->chapters[i].start -= mkv_d->first_tc; 2691 demuxer->chapters[i].end -= mkv_d->first_tc; 2692 } 2693 if (dvd_last_chapter > 0 && dvd_last_chapter <= demuxer->num_chapters) 2694 { 2695 if (demuxer->chapters[dvd_last_chapter-1].end != 0) 2696 mkv_d->stop_timecode = demuxer->chapters[dvd_last_chapter-1].end; 2697 else if (dvd_last_chapter + 1 <= demuxer->num_chapters) 2698 mkv_d->stop_timecode = demuxer->chapters[dvd_last_chapter].start; 2699 } 2700 } 2701 2702 if (s->end_pos == 0 || (mkv_d->indexes == NULL && index_mode < 0)) 2703 demuxer->seekable = 0; 2704 else 2705 { 2706 demuxer->movi_start = s->start_pos; 2707 demuxer->movi_end = s->end_pos; 2708 demuxer->seekable = 1; 2709 if (demuxer->chapters && dvd_chapter>1 && dvd_chapter<=demuxer->num_chapters) 2710 { 2711 if (!mkv_d->has_first_tc) 2338 2712 { 2339 int p, l; 2340 dprintf ("[mkv] |+ found cluster, headers are " 2341 "parsed completely :)\n"); 2342 /* get the first cluster timecode */ 2343 p = stream_tell(s); 2344 l = ebml_read_length (s, NULL); 2345 while (ebml_read_id (s, NULL) != MATROSKA_ID_CLUSTERTIMECODE) 2346 { 2347 ebml_read_skip (s, NULL); 2348 if (stream_tell (s) >= p + l) 2349 break; 2350 } 2351 if (stream_tell (s) < p + l) 2352 { 2353 uint64_t num = ebml_read_uint (s, NULL); 2354 if (num == EBML_UINT_INVALID) 2355 return 0; 2356 mkv_d->first_tc = num * mkv_d->tc_scale / 1000000.0; 2357 mkv_d->has_first_tc = 1; 2358 } 2359 stream_seek (s, p - 4); 2360 cont = 1; 2361 break; 2713 mkv_d->first_tc = 0; 2714 mkv_d->has_first_tc = 1; 2362 2715 } 2363 2364 default: 2365 cont = 1; 2366 case MATROSKA_ID_ATTACHMENTS: 2367 case EBML_ID_VOID: 2368 ebml_read_skip (s, NULL); 2369 break; 2370 } 2371 } 2372 2373 display_tracks (mkv_d); 2374 2375 /* select video track */ 2376 track = NULL; 2377 if (demuxer->video->id == -1) /* automatically select a video track */ 2378 { 2379 /* search for a video track that has the 'default' flag set */ 2380 for (i=0; i<mkv_d->num_tracks; i++) 2381 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO 2382 && mkv_d->tracks[i]->default_track) 2383 { 2384 track = mkv_d->tracks[i]; 2385 break; 2386 } 2387 2388 if (track == NULL) 2389 /* no track has the 'default' flag set */ 2390 /* let's take the first video track */ 2391 for (i=0; i<mkv_d->num_tracks; i++) 2392 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_VIDEO) 2393 { 2394 track = mkv_d->tracks[i]; 2395 break; 2396 } 2397 } 2398 else if (demuxer->video->id != -2) /* -2 = no video at all */ 2399 track = demux_mkv_find_track_by_num (mkv_d, demuxer->video->id, 2400 MATROSKA_TRACK_VIDEO); 2401 else 2402 { 2403 dprintf("[mkv] No audio track found/wanted.\n"); 2404 demuxer->audio->id = -2; 2405 } 2406 2407 if(demuxer->audio->id != -2) 2408 for (i=0; i < mkv_d->num_tracks; i++) 2409 { 2410 if(mkv_d->tracks[i]->type != MATROSKA_TRACK_AUDIO) 2411 continue; 2412 if(!demux_mkv_open_audio (demuxer, mkv_d->tracks[i])) 2413 { 2414 if(track && mkv_d->tracks[i] == track) 2415 { 2416 demuxer->video->id = track->tnum; 2417 demuxer->video->sh = demuxer->v_streams[track->tnum]; 2418 } 2419 mkv_d->last_aid++; 2420 if(mkv_d->last_aid == MAX_A_STREAMS) 2421 break; 2422 } 2423 } 2424 2425 /* select audio track */ 2426 track = NULL; 2427 if (demuxer->audio->id == -1) /* automatically select an audio track */ 2428 { 2429 /* check if the user specified an audio language */ 2430 if (audio_lang != NULL) 2431 track = demux_mkv_find_track_by_language(mkv_d, audio_lang, 2432 MATROSKA_TRACK_AUDIO); 2433 if (track == NULL) 2434 /* no audio language specified, or language not found */ 2435 /* search for an audio track that has the 'default' flag set */ 2436 for (i=0; i < mkv_d->num_tracks; i++) 2437 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO 2438 && mkv_d->tracks[i]->default_track) 2439 { 2440 track = mkv_d->tracks[i]; 2441 break; 2442 } 2443 2444 if (track == NULL) 2445 /* no track has the 'default' flag set */ 2446 /* let's take the first audio track */ 2447 for (i=0; i < mkv_d->num_tracks; i++) 2448 if (mkv_d->tracks[i]->type == MATROSKA_TRACK_AUDIO) 2449 { 2450 track = mkv_d->tracks[i]; 2451 break; 2452 } 2453 } 2454 else if (demuxer->audio->id != -2) /* -2 = no audio at all */ 2455 track = demux_mkv_find_track_by_num (mkv_d, demuxer->audio->id, 2456 MATROSKA_TRACK_AUDIO); 2457 2458 if (track && !demux_mkv_open_audio (demuxer, track)) 2459 { 2460 dprintf ( 2461 "[mkv] Will play audio track %u\n", track->tnum); 2462 demuxer->audio->id = track->tnum; 2463 demuxer->audio->sh = demuxer->a_streams[track->tnum]; 2464 } 2465 else 2466 { 2467 dprintf ("[mkv] No audio track found/wanted.\n"); 2468 demuxer->audio->id = -2; 2469 } 2470 2471 demux_mkv_parse_vobsub_data (demuxer); 2472 /* DO NOT automatically select a subtitle track and behave like DVD */ 2473 /* playback: only show subtitles if the user explicitely wants them. */ 2474 track = NULL; 2475 if (demuxer->sub->id >= 0) 2476 track = demux_mkv_find_track_by_num (mkv_d, demuxer->sub->id, 2477 MATROSKA_TRACK_SUBTITLE); 2478 else if (dvdsub_lang != NULL) 2479 track = demux_mkv_find_track_by_language (mkv_d, dvdsub_lang, 2480 MATROSKA_TRACK_SUBTITLE); 2481 2482 if (track && !demux_mkv_open_sub (demuxer, track)) 2483 { 2484 dprintf ( 2485 "[mkv] Will display subtitle track %u\n", track->tnum); 2486 //dvdsub_id = demux_mkv_reverse_id(mkv_d, track->tnum, MATROSKA_TRACK_SUBTITLE); 2487 demuxer->sub->id = track->tnum; 2488 } 2489 else 2490 demuxer->sub->id = -2; 2491 2492 if (demuxer->chapters) 2493 { 2494 for (i=0; i < (int)demuxer->num_chapters; i++) 2495 { 2496 demuxer->chapters[i].start -= mkv_d->first_tc; 2497 demuxer->chapters[i].end -= mkv_d->first_tc; 2498 } 2499 if (dvd_last_chapter > 0 && dvd_last_chapter <= demuxer->num_chapters) 2500 { 2501 if (demuxer->chapters[dvd_last_chapter-1].end != 0) 2502 mkv_d->stop_timecode = demuxer->chapters[dvd_last_chapter-1].end; 2503 else if (dvd_last_chapter + 1 <= demuxer->num_chapters) 2504 mkv_d->stop_timecode = demuxer->chapters[dvd_last_chapter].start; 2505 } 2506 } 2507 2508 if (s->end_pos == 0 || (mkv_d->indexes == NULL && index_mode < 0)) 2509 demuxer->seekable = 0; 2510 else 2511 { 2512 demuxer->movi_start = s->start_pos; 2513 demuxer->movi_end = s->end_pos; 2514 demuxer->seekable = 1; 2515 if (demuxer->chapters && dvd_chapter>1 && dvd_chapter<=demuxer->num_chapters) 2516 { 2517 if (!mkv_d->has_first_tc) 2518 { 2519 mkv_d->first_tc = 0; 2520 mkv_d->has_first_tc = 1; 2521 } 2522 demux_mkv_seek (demuxer, 2523 demuxer->chapters[dvd_chapter-1].start/1000.0, /*0.0,*/ 1); 2524 } 2525 } 2526 2527 return DEMUXER_TYPE_MATROSKA; 2716 demux_mkv_seek (demuxer, 2717 demuxer->chapters[dvd_chapter-1].start/1000.0, 0.0, 1); 2718 } 2719 } 2720 2721 return DEMUXER_TYPE_MATROSKA; 2528 2722 } 2529 2723 … … 2531 2725 demux_close_mkv (demuxer_t *demuxer) 2532 2726 { 2533 2534 2535 2536 { 2537 2727 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 2728 2729 if (mkv_d) 2730 { 2731 int i; 2538 2732 #ifdef USE_ICONV 2539 2733 subcp_close(); 2540 2734 #endif 2541 free_cached_dps (demuxer); 2542 if (mkv_d->tracks) 2543 { 2544 for (i=0; i<mkv_d->num_tracks; i++) 2545 demux_mkv_free_trackentry(mkv_d->tracks[i]); 2546 for (i=0; i < SUB_MAX_TEXT; i++) 2547 if (mkv_d->subs.text[i]) 2548 free (mkv_d->subs.text[i]); 2549 free (mkv_d->tracks); 2550 } 2551 if (mkv_d->indexes) 2552 free (mkv_d->indexes); 2553 if (mkv_d->cluster_positions) 2554 free (mkv_d->cluster_positions); 2555 if (mkv_d->parsed_cues) 2556 free (mkv_d->parsed_cues); 2557 if (mkv_d->parsed_seekhead) 2558 free (mkv_d->parsed_seekhead); 2559 free (mkv_d); 2735 free_cached_dps (demuxer); 2736 if (mkv_d->tracks) 2737 { 2738 for (i=0; i<mkv_d->num_tracks; i++) 2739 demux_mkv_free_trackentry(mkv_d->tracks[i]); 2740 for (i=0; i < SUB_MAX_TEXT; i++) 2741 if (mkv_d->subs.text[i]) 2742 free (mkv_d->subs.text[i]); 2743 free (mkv_d->tracks); 2744 } 2745 if (mkv_d->indexes) 2746 free (mkv_d->indexes); 2747 if (mkv_d->cluster_positions) 2748 free (mkv_d->cluster_positions); 2749 if (mkv_d->parsed_cues) 2750 free (mkv_d->parsed_cues); 2751 if (mkv_d->parsed_seekhead) 2752 free (mkv_d->parsed_seekhead); 2753 if (mkv_d->attachments) { 2754 for (i = 0; i < mkv_d->num_attachments; ++i) { 2755 if (mkv_d->attachments[i].name) 2756 free (mkv_d->attachments[i].name); 2757 if (mkv_d->attachments[i].mime) 2758 free (mkv_d->attachments[i].mime); 2759 if (mkv_d->attachments[i].data) 2760 free (mkv_d->attachments[i].data); 2761 } 2762 free (mkv_d->attachments); 2763 } 2764 free (mkv_d); 2560 2765 } 2561 2766 } … … 2565 2770 uint8_t *laces, uint32_t **all_lace_sizes) 2566 2771 { 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2772 uint32_t total = 0, *lace_size; 2773 uint8_t flags; 2774 int i; 2775 2776 *all_lace_sizes = NULL; 2777 lace_size = NULL; 2778 /* lacing flags */ 2779 flags = *buffer++; 2780 (*size)--; 2781 2782 switch ((flags & 0x06) >> 1) 2578 2783 { 2579 2784 case 0: /* no lacing */ 2580 2581 lace_size = (uint32_t *)calloc(*laces, sizeof(uint32_t));2582 2583 2785 *laces = 1; 2786 lace_size = calloc(*laces, sizeof(uint32_t)); 2787 lace_size[0] = *size; 2788 break; 2584 2789 2585 2790 case 1: /* xiph lacing */ 2586 2791 case 2: /* fixed-size lacing */ 2587 2792 case 3: /* EBML lacing */ 2588 2589 2590 2591 lace_size = (uint32_t *)calloc(*laces, sizeof(uint32_t));2592 2593 2793 *laces = *buffer++; 2794 (*size)--; 2795 (*laces)++; 2796 lace_size = calloc(*laces, sizeof(uint32_t)); 2797 2798 switch ((flags & 0x06) >> 1) 2594 2799 { 2595 2800 case 1: /* xiph lacing */ 2596 2801 for (i=0; i < *laces-1; i++) 2597 2802 { 2598 lace_size[i] = 0;2599 2803 lace_size[i] = 0; 2804 do 2600 2805 { 2601 2602 2806 lace_size[i] += *buffer; 2807 (*size)--; 2603 2808 } while (*buffer++ == 0xFF); 2604 2809 total += lace_size[i]; 2605 2810 } 2606 2607 2811 lace_size[i] = *size - total; 2812 break; 2608 2813 2609 2814 case 2: /* fixed-size lacing */ 2610 2611 2612 2815 for (i=0; i < *laces; i++) 2816 lace_size[i] = *size / *laces; 2817 break; 2613 2818 2614 2819 case 3: /* EBML lacing */ 2615 { 2616 int l; 2617 uint64_t num = ebml_read_vlen_uint (buffer, &l); 2618 if (num == EBML_UINT_INVALID) { 2619 free(lace_size); 2620 return 1; 2820 { 2821 int l; 2822 uint64_t num = ebml_read_vlen_uint (buffer, &l); 2823 if (num == EBML_UINT_INVALID) { 2824 free(lace_size); 2825 return 1; 2826 } 2827 buffer += l; 2828 *size -= l; 2829 2830 total = lace_size[0] = num; 2831 for (i=1; i < *laces-1; i++) 2832 { 2833 int64_t snum; 2834 snum = ebml_read_vlen_int (buffer, &l); 2835 if (snum == EBML_INT_INVALID) { 2836 free(lace_size); 2837 return 1; 2621 2838 } 2622 2839 buffer += l; 2623 2840 *size -= l; 2624 2625 total = lace_size[0] = num; 2626 for (i=1; i < *laces-1; i++) 2627 { 2628 int64_t snum; 2629 snum = ebml_read_vlen_int (buffer, &l); 2630 if (snum == EBML_INT_INVALID) { 2631 free(lace_size); 2632 return 1; 2633 } 2634 buffer += l; 2635 *size -= l; 2636 lace_size[i] = lace_size[i-1] + snum; 2637 total += lace_size[i]; 2638 } 2639 lace_size[i] = *size - total; 2640 break; 2641 } 2642 } 2643 break; 2644 } 2645 *all_lace_sizes = lace_size; 2646 return 0; 2647 } 2841 lace_size[i] = lace_size[i-1] + snum; 2842 total += lace_size[i]; 2843 } 2844 lace_size[i] = *size - total; 2845 break; 2846 } 2847 } 2848 break; 2849 } 2850 *all_lace_sizes = lace_size; 2851 return 0; 2852 } 2853 2854 static void 2855 clear_subtitles(demuxer_t *demuxer, uint64_t timecode, int clear_all); 2648 2856 2649 2857 static void … … 2651 2859 int64_t size, uint64_t block_duration, uint64_t timecode) 2652 2860 { 2653 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 2654 char *ptr1, *ptr2; 2655 int state, i; 2656 2657 if (block_duration == 0) 2658 { 2659 dprintf ( "[mkv] Warning: No BlockDuration " 2660 "for subtitle track found.\n"); 2861 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 2862 char *ptr1, *ptr2; 2863 int state, i; 2864 2865 if (block_duration == 0) 2866 { 2867 dprintf( 2868 MSGTR_MPDEMUX_MKV_NoBlockDurationForSubtitleTrackFound); 2869 return; 2870 } 2871 2872 #ifdef USE_ASS 2873 if (ass_enabled && track->subtitle_type == MATROSKA_SUBTYPE_SSA) { 2874 ass_process_chunk(track->sh_sub.ass_track, block, size, (long long)timecode, (long long)block_duration); 2875 return; 2876 } 2877 clear_subtitles(demuxer, timecode, 1); 2878 #endif 2879 2880 ptr1 = block; 2881 while (ptr1 - block <= size && (*ptr1 == '\n' || *ptr1 == '\r')) 2882 ptr1++; 2883 ptr2 = block + size - 1; 2884 while (ptr2 >= block && (*ptr2 == '\n' || *ptr2 == '\r')) 2885 { 2886 *ptr2 = 0; 2887 ptr2--; 2888 } 2889 2890 if (mkv_d->subs.lines > SUB_MAX_TEXT - 2) 2891 { 2892 dprintf( 2893 MSGTR_MPDEMUX_MKV_TooManySublines); 2894 return; 2895 } 2896 ptr2 = mkv_d->subs.text[mkv_d->subs.lines]; 2897 state = 0; 2898 2899 if (track->subtitle_type == MATROSKA_SUBTYPE_SSA) 2900 { 2901 /* Find text section. */ 2902 for (i=0; i < 8 && *ptr1 != '\0'; ptr1++) 2903 if (*ptr1 == ',') 2904 i++; 2905 if (*ptr1 == '\0') /* Broken line? */ 2661 2906 return; 2662 } 2663 2664 ptr1 = block; 2665 while (ptr1 - block <= size && (*ptr1 == '\n' || *ptr1 == '\r')) 2666 ptr1++; 2667 ptr2 = block + size - 1; 2668 while (ptr2 >= block && (*ptr2 == '\n' || *ptr2 == '\r')) 2669 { 2670 *ptr2 = 0; 2671 ptr2--; 2672 } 2673 2674 if (mkv_d->subs.lines > SUB_MAX_TEXT - 2) 2675 { 2676 dprintf ( "[mkv] Warning: too many sublines " 2677 "to render, skipping\n"); 2678 return; 2679 } 2680 ptr2 = mkv_d->subs.text[mkv_d->subs.lines]; 2681 state = 0; 2682 2683 if (track->subtitle_type == MATROSKA_SUBTYPE_SSA) 2684 { 2685 /* Find text section. */ 2686 for (i=0; i < 8 && *ptr1 != '\0'; ptr1++) 2687 if (*ptr1 == ',') 2688 i++; 2689 if (*ptr1 == '\0') /* Broken line? */ 2690 return; 2691 2692 /* Load text. */ 2693 while (ptr1 - block < size) 2694 { 2695 if (*ptr1 == '{') 2696 state = 1; 2697 else if (*ptr1 == '}' && state == 1) 2698 state = 2; 2699 2700 if (state == 0) 2907 2908 /* Load text. */ 2909 while (ptr1 - block < size) 2910 { 2911 if (*ptr1 == '{') 2912 state = 1; 2913 else if (*ptr1 == '}' && state == 1) 2914 state = 2; 2915 2916 if (state == 0) 2701 2917 { 2702 2703 2704 2918 *ptr2++ = *ptr1; 2919 if (ptr2 - mkv_d->subs.text[mkv_d->subs.lines] >= 255) 2920 break; 2705 2921 } 2706 2707 2708 2709 while (*ptr1 == '\\' && ptr1+1-block < size&& (*(ptr1+1)|0x20) == 'n')2922 ptr1++; 2923 2924 /* Newline */ 2925 while (ptr1+1-block < size && *ptr1 == '\\' && (*(ptr1+1)|0x20) == 'n') 2710 2926 { 2711 mkv_d->clear_subs_at[mkv_d->subs.lines++] 2927 mkv_d->clear_subs_at[mkv_d->subs.lines++] 2928 = timecode + block_duration; 2929 *ptr2 = '\0'; 2930 if (mkv_d->subs.lines >= SUB_MAX_TEXT) 2931 { 2932 dprintf( 2933 MSGTR_MPDEMUX_MKV_TooManySublinesSkippingAfterFirst, 2934 SUB_MAX_TEXT); 2935 mkv_d->subs.lines--; 2936 ptr1=block+size; 2937 break; 2938 } 2939 ptr2 = mkv_d->subs.text[mkv_d->subs.lines]; 2940 ptr1 += 2; 2941 } 2942 2943 if (state == 2) 2944 state = 0; 2945 } 2946 *ptr2 = '\0'; 2947 } 2948 else 2949 { 2950 while (ptr1 - block < size) 2951 { 2952 if (*ptr1 == '\n' || *ptr1 == '\r') 2953 { 2954 if (state == 0) /* normal char --> newline */ 2955 { 2956 *ptr2 = '\0'; 2957 mkv_d->clear_subs_at[mkv_d->subs.lines++] 2712 2958 = timecode + block_duration; 2713 *ptr2 = '\0'; 2714 if (mkv_d->subs.lines >= SUB_MAX_TEXT) 2715 { 2716 dprintf ( "\n[mkv] Warning: too many " 2717 "sublines to render, skipping after first %i\n", 2718 SUB_MAX_TEXT); 2719 mkv_d->subs.lines--; 2720 ptr1=block+size; 2721 break; 2722 } 2723 ptr2 = mkv_d->subs.text[mkv_d->subs.lines]; 2724 ptr1 += 2; 2725 } 2726 2727 if (state == 2) 2728 state = 0; 2729 } 2730 *ptr2 = '\0'; 2731 } 2732 else 2733 { 2734 while (ptr1 - block < size) 2735 { 2736 if (*ptr1 == '\n' || *ptr1 == '\r') 2737 { 2738 if (state == 0) /* normal char --> newline */ 2739 { 2740 *ptr2 = '\0'; 2741 mkv_d->clear_subs_at[mkv_d->subs.lines++] 2742 = timecode + block_duration; 2743 if (mkv_d->subs.lines >= SUB_MAX_TEXT) 2959 if (mkv_d->subs.lines >= SUB_MAX_TEXT) 2744 2960 { 2745 dprintf ( "\n[mkv] Warning: too many " 2746 "sublines to render, skipping after first %i\n", 2747 SUB_MAX_TEXT); 2748 mkv_d->subs.lines--; 2749 ptr1=block+size; 2750 break; 2961 dprintf("[mkv]: too many sublines skipping after first\n"); 2962 mkv_d->subs.lines--; 2963 ptr1=block+size; 2964 break; 2751 2965 } 2752 2753 2966 ptr2 = mkv_d->subs.text[mkv_d->subs.lines]; 2967 state = 1; 2754 2968 } 2755 2969 } 2756 2757 2758 2759 2760 2970 else if (*ptr1 == '<') /* skip HTML tags */ 2971 state = 2; 2972 else if (*ptr1 == '>') 2973 state = 0; 2974 else if (state != 2) /* normal character */ 2761 2975 { 2762 2763 2764 2976 state = 0; 2977 if ((ptr2 - mkv_d->subs.text[mkv_d->subs.lines]) < 255) 2978 *ptr2++ = *ptr1; 2765 2979 } 2766 ptr1++; 2767 } 2768 *ptr2 = '\0'; 2769 } 2770 mkv_d->clear_subs_at[mkv_d->subs.lines++] = timecode + block_duration; 2771 2772 #ifdef USE_ICONV 2773 subcp_recode1 (&mkv_d->subs); 2980 ptr1++; 2981 } 2982 *ptr2 = '\0'; 2983 } 2984 mkv_d->clear_subs_at[mkv_d->subs.lines++] = timecode + block_duration; 2985 2986 //sub_utf8 = 1; 2987 #ifdef USE_ASS 2988 if (ass_enabled) { 2989 mkv_d->subs.start = timecode / 10; 2990 mkv_d->subs.end = (timecode + block_duration) / 10; 2991 ass_process_subtitle(track->sh_sub.ass_track, &mkv_d->subs); 2992 } else 2774 2993 #endif 2775 //sub_utf8 = 1; 2776 vo_sub = &mkv_d->subs; 2777 vo_osd_changed (OSDTYPE_SUBTITLE); 2994 vo_sub = &mkv_d->subs; 2995 vo_osd_changed (OSDTYPE_SUBTITLE); 2778 2996 } 2779 2997 … … 2781 2999 clear_subtitles(demuxer_t *demuxer, uint64_t timecode, int clear_all) 2782 3000 { 2783 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 2784 int i, lines_cut = 0; 2785 char *tmp; 2786 2787 /* Clear all? */ 2788 if (clear_all) 2789 { 2790 lines_cut = mkv_d->subs.lines; 2791 mkv_d->subs.lines = 0; 2792 if (lines_cut) 2793 { 2794 vo_sub = &mkv_d->subs; 2795 vo_osd_changed (OSDTYPE_SUBTITLE); 2796 } 2797 return; 2798 } 2799 2800 /* Clear the subtitles if they're obsolete now. */ 2801 for (i=0; i < mkv_d->subs.lines; i++) 2802 { 2803 if (mkv_d->clear_subs_at[i] <= timecode) 2804 { 2805 tmp = mkv_d->subs.text[i]; 2806 memmove (mkv_d->subs.text+i, mkv_d->subs.text+i+1, 2807 (mkv_d->subs.lines-i-1) * sizeof (*mkv_d->subs.text)); 2808 memmove (mkv_d->clear_subs_at+i, mkv_d->clear_subs_at+i+1, 2809 (mkv_d->subs.lines-i-1) * sizeof (*mkv_d->clear_subs_at)); 2810 mkv_d->subs.text[--mkv_d->subs.lines] = tmp; 2811 i--; 2812 lines_cut = 1; 2813 } 2814 } 2815 if (lines_cut) 2816 { 2817 vo_sub = &mkv_d->subs; 2818 vo_osd_changed (OSDTYPE_SUBTITLE); 3001 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3002 int i, lines_cut = 0; 3003 char *tmp; 3004 3005 /* Clear all? */ 3006 if (clear_all) 3007 { 3008 lines_cut = mkv_d->subs.lines; 3009 mkv_d->subs.lines = 0; 3010 #ifdef USE_ASS 3011 if (!ass_enabled) 3012 #endif 3013 if (lines_cut) 3014 { 3015 vo_sub = &mkv_d->subs; 3016 vo_osd_changed (OSDTYPE_SUBTITLE); 3017 } 3018 return; 3019 } 3020 3021 /* Clear the subtitles if they're obsolete now. */ 3022 for (i=0; i < mkv_d->subs.lines; i++) 3023 { 3024 if (mkv_d->clear_subs_at[i] <= timecode) 3025 { 3026 tmp = mkv_d->subs.text[i]; 3027 memmove (mkv_d->subs.text+i, mkv_d->subs.text+i+1, 3028 (mkv_d->subs.lines-i-1) * sizeof (*mkv_d->subs.text)); 3029 memmove (mkv_d->clear_subs_at+i, mkv_d->clear_subs_at+i+1, 3030 (mkv_d->subs.lines-i-1) * sizeof (*mkv_d->clear_subs_at)); 3031 mkv_d->subs.text[--mkv_d->subs.lines] = tmp; 3032 i--; 3033 lines_cut = 1; 3034 } 3035 } 3036 #ifdef USE_ASS 3037 if (!ass_enabled) 3038 #endif 3039 if (lines_cut) 3040 { 3041 vo_sub = &mkv_d->subs; 3042 vo_osd_changed (OSDTYPE_SUBTITLE); 2819 3043 } 2820 3044 } … … 2826 3050 static float real_fix_timestamp(mkv_track_t *track, unsigned char *s, 2827 3051 int timestamp) { 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 3052 float v_pts; 3053 uint32_t buffer = (s[0] << 24) + (s[1] << 16) + (s[2] << 8) + s[3]; 3054 int kf = timestamp; 3055 int pict_type; 3056 int orig_kf; 3057 3058 if (!strcmp(track->codec_id, MKV_V_REALV30) || 3059 !strcmp(track->codec_id, MKV_V_REALV40)) { 3060 3061 if (!strcmp(track->codec_id, MKV_V_REALV30)) { 3062 SKIP_BITS(3); 3063 pict_type = SHOW_BITS(2); 3064 SKIP_BITS(2 + 7); 3065 }else{ 3066 SKIP_BITS(1); 3067 pict_type = SHOW_BITS(2); 3068 SKIP_BITS(2 + 7 + 3); 3069 } 3070 kf = SHOW_BITS(13); // kf= 2*SHOW_BITS(12); 3071 orig_kf = kf; 3072 if (pict_type <= 1) { 3073 // I frame, sync timestamps: 3074 track->rv_kf_base = timestamp - kf; 3075 dprintf("\nTS: base=%08X\n", track->rv_kf_base); 3076 kf = timestamp; 3077 } else { 3078 // P/B frame, merge timestamps: 3079 int tmp = timestamp - track->rv_kf_base; 3080 kf |= tmp & (~0x1fff); // combine with packet timestamp 3081 if (kf < (tmp - 4096)) // workaround wrap-around problems 3082 kf += 8192; 3083 else if (kf > (tmp + 4096)) 3084 kf -= 8192; 3085 kf += track->rv_kf_base; 3086 } 3087 if (pict_type != 3) { // P || I frame -> swap timestamps 3088 int tmp = kf; 3089 kf = track->rv_kf_pts; 3090 track->rv_kf_pts = tmp; 3091 } 3092 dprintf("\nTS: %08X -> %08X (%04X) %d %02X %02X %02X " 3093 "%02X %5d\n", timestamp, kf, orig_kf, pict_type, s[0], s[1], s[2], 3094 s[3], kf - (int)(1000.0 * track->rv_pts)); 3095 } 3096 v_pts = kf * 0.001f; 3097 track->rv_pts = v_pts; 3098 3099 return v_pts; 2876 3100 } 2877 3101 … … 2880 3104 uint32_t size, int block_bref) 2881 3105 { 2882 2883 2884 2885 2886 3106 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3107 demux_packet_t *dp; 3108 dp_hdr_t *hdr; 3109 uint8_t chunks; 3110 int isize; 2887 3111 #ifdef WORDS_BIGENDIAN 2888 2889 3112 uint8_t *p; 3113 int i; 2890 3114 #endif 2891 3115 2892 2893 2894 2895 3116 chunks = *buffer++; 3117 isize = --size - (chunks+1)*8; 3118 dp = new_demux_packet (sizeof (*hdr) + size); 3119 memcpy (dp->buffer + sizeof(*hdr), buffer + (chunks+1)*8, isize); 2896 3120 #ifdef WORDS_BIGENDIAN 2897 2898 2899 2900 2901 2902 2903 3121 p = (uint8_t *)(dp->buffer + sizeof(*hdr) + isize); 3122 for (i = 0; i<(chunks+1)*8; i+=4) { 3123 p[i] = *((uint8_t *)buffer+i+3); 3124 p[i+1] = *((uint8_t *)buffer+i+2); 3125 p[i+2] = *((uint8_t *)buffer+i+1); 3126 p[i+3] = *((uint8_t *)buffer+i); 3127 } 2904 3128 #else 2905 3129 memcpy (dp->buffer + sizeof(*hdr) + isize, buffer, (chunks+1)*8); 2906 3130 #endif 2907 3131 2908 2909 2910 2911 2912 2913 2914 2915 2916 { 2917 2918 2919 2920 } 2921 2922 2923 2924 2925 2926 2927 3132 hdr = (dp_hdr_t *) dp->buffer; 3133 hdr->len = isize; 3134 hdr->chunks = chunks; 3135 hdr->timestamp = mkv_d->last_pts * 1000; 3136 hdr->chunktab = sizeof(*hdr) + isize; 3137 3138 dp->len = sizeof(*hdr) + size; 3139 if (mkv_d->v_skip_to_keyframe) 3140 { 3141 dp->pts = mkv_d->last_pts; 3142 track->rv_kf_base = 0; 3143 track->rv_kf_pts = hdr->timestamp; 3144 } 3145 else 3146 dp->pts = real_fix_timestamp (track, dp->buffer + sizeof(*hdr), 3147 hdr->timestamp); 3148 dp->pos = demuxer->filepos; 3149 dp->flags = block_bref ? 0 : 0x10; 3150 3151 ds_add_packet(demuxer->video, dp); 2928 3152 } 2929 3153 … … 2932 3156 uint32_t size, int block_bref) 2933 3157 { 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 { 2948 2949 2950 3158 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3159 int sps = track->sub_packet_size; 3160 int sph = track->sub_packet_h; 3161 int cfs = track->coded_framesize; 3162 int w = track->audiopk_size; 3163 int spc = track->sub_packet_cnt; 3164 demux_packet_t *dp; 3165 int x; 3166 3167 if ((track->a_formattag == mmioFOURCC('2', '8', '_', '8')) || 3168 (track->a_formattag == mmioFOURCC('c', 'o', 'o', 'k')) || 3169 (track->a_formattag == mmioFOURCC('a', 't', 'r', 'c')) || 3170 (track->a_formattag == mmioFOURCC('s', 'i', 'p', 'r'))) 3171 { 3172 // if(!block_bref) 3173 // spc = track->sub_packet_cnt = 0; 3174 switch (track->a_formattag) { 2951 3175 case mmioFOURCC('2', '8', '_', '8'): 2952 2953 2954 3176 for (x = 0; x < sph / 2; x++) 3177 memcpy(track->audio_buf + x * 2 * w + spc * cfs, buffer + cfs * x, cfs); 3178 break; 2955 3179 case mmioFOURCC('c', 'o', 'o', 'k'): 2956 3180 case mmioFOURCC('a', 't', 'r', 'c'): 2957 2958 2959 3181 for (x = 0; x < w / sps; x++) 3182 memcpy(track->audio_buf + sps * (sph * x + ((sph + 1) / 2) * (spc & 1) + (spc >> 1)), buffer + sps * x, sps); 3183 break; 2960 3184 case mmioFOURCC('s', 'i', 'p', 'r'): 2961 2962 3185 memcpy(track->audio_buf + spc * w, buffer, w); 3186 if (spc == sph - 1) 2963 3187 { 2964 2965 2966 2967 3188 int n; 3189 int bs = sph * w * 2 / 96; // nibbles per subpacket 3190 // Perform reordering 3191 for(n=0; n < 38; n++) 2968 3192 { 2969 2970 2971 2972 2973 3193 int j; 3194 int i = bs * sipr_swaps[n][0]; 3195 int o = bs * sipr_swaps[n][1]; 3196 // swap nibbles of block 'i' with 'o' TODO: optimize 3197 for(j = 0;j < bs; j++) 2974 3198 { 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 3199 int x = (i & 1) ? (track->audio_buf[i >> 1] >> 4) : (track->audio_buf[i >> 1] & 0x0F); 3200 int y = (o & 1) ? (track->audio_buf[o >> 1] >> 4) : (track->audio_buf[o >> 1] & 0x0F); 3201 if(o & 1) 3202 track->audio_buf[o >> 1] = (track->audio_buf[o >> 1] & 0x0F) | (x << 4); 3203 else 3204 track->audio_buf[o >> 1] = (track->audio_buf[o >> 1] & 0xF0) | x; 3205 if(i & 1) 3206 track->audio_buf[i >> 1] = (track->audio_buf[i >> 1] & 0x0F) | (y << 4); 3207 else 3208 track->audio_buf[i >> 1] = (track->audio_buf[i >> 1] & 0xF0) | y; 3209 ++i; ++o; 2986 3210 } 2987 3211 } 2988 3212 } 2989 2990 2991 2992 2993 2994 2995 2996 { 2997 2998 2999 3000 3001 {3002 3003 3004 3005 3006 3007 3008 3009 }3010 } 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3213 break; 3214 } 3215 track->audio_timestamp[track->sub_packet_cnt] = (track->ra_pts == mkv_d->last_pts) ? 0 : (mkv_d->last_pts); 3216 track->ra_pts = mkv_d->last_pts; 3217 if (track->sub_packet_cnt == 0) 3218 track->audio_filepos = demuxer->filepos; 3219 if (++(track->sub_packet_cnt) == sph) 3220 { 3221 int apk_usize = ((WAVEFORMATEX*)((sh_audio_t*)demuxer->audio->sh)->wf)->nBlockAlign; 3222 track->sub_packet_cnt = 0; 3223 // Release all the audio packets 3224 for (x = 0; x < sph*w/apk_usize; x++) 3225 { 3226 dp = new_demux_packet(apk_usize); 3227 memcpy(dp->buffer, track->audio_buf + x * apk_usize, apk_usize); 3228 /* Put timestamp only on packets that correspond to original audio packets in file */ 3229 dp->pts = (x * apk_usize % w) ? 0 : track->audio_timestamp[x * apk_usize / w]; 3230 dp->pos = track->audio_filepos; // all equal 3231 dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe 3232 ds_add_packet(demuxer->audio, dp); 3233 } 3234 } 3235 } else { // Not a codec that require reordering 3236 dp = new_demux_packet (size); 3237 memcpy(dp->buffer, buffer, size); 3238 if (track->ra_pts == mkv_d->last_pts && !mkv_d->a_skip_to_keyframe) 3239 dp->pts = 0; 3240 else 3241 dp->pts = mkv_d->last_pts; 3242 track->ra_pts = mkv_d->last_pts; 3243 3244 dp->pos = demuxer->filepos; 3245 dp->flags = block_bref ? 0 : 0x10; 3246 ds_add_packet (demuxer->audio, dp); 3247 } 3024 3248 } 3025 3249 … … 3045 3269 flush_cached_dps (demuxer_t *demuxer, mkv_track_t *track) 3046 3270 { 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3271 int i, ok; 3272 3273 if (track->num_cached_dps == 0) 3274 return; 3275 3276 do { 3277 ok = 1; 3278 for (i = 1; i < track->num_cached_dps; i++) 3279 if (track->cached_dps[i - 1]->pts > track->cached_dps[i]->pts) { 3280 float tmp_pts = track->cached_dps[i - 1]->pts; 3281 track->cached_dps[i - 1]->pts = track->cached_dps[i]->pts; 3282 track->cached_dps[i]->pts = tmp_pts; 3283 ok = 0; 3284 } 3285 } while (!ok); 3286 3287 for (i = 0; i < track->num_cached_dps; i++) 3288 ds_add_packet (demuxer->video, track->cached_dps[i]); 3289 track->num_cached_dps = 0; 3066 3290 } 3067 3291 … … 3090 3314 uint32_t size, int block_bref, int block_fref) 3091 3315 { 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 { 3107 3108 3109 3110 3111 } 3112 3113 3114 3115 3316 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3317 demux_packet_t *dp; 3318 3319 dp = new_demux_packet (size); 3320 memcpy(dp->buffer, buffer, size); 3321 dp->pos = demuxer->filepos; 3322 dp->pts = mkv_d->last_pts; 3323 if ((track->num_cached_dps > 0) && (dp->pts < track->max_pts)) 3324 block_fref = 1; 3325 if (block_fref == 0) /* I or P frame */ 3326 flush_cached_dps (demuxer, track); 3327 if (block_bref != 0) /* I frame, don't cache it */ 3328 dp->flags = 0x10; 3329 if ((track->num_cached_dps + 1) > track->num_allocated_dps) 3330 { 3331 track->cached_dps = (demux_packet_t **) 3332 realloc(track->cached_dps, (track->num_cached_dps + 10) * 3333 sizeof(demux_packet_t *)); 3334 track->num_allocated_dps += 10; 3335 } 3336 track->cached_dps[track->num_cached_dps] = dp; 3337 track->num_cached_dps++; 3338 if (dp->pts > track->max_pts) 3339 track->max_pts = dp->pts; 3116 3340 } 3117 3341 … … 3120 3344 uint64_t block_duration, int64_t block_bref, int64_t block_fref, uint8_t simpleblock) 3121 3345 { 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 { 3164 3165 3166 } 3167 3168 { 3169 3170 3171 if (mkv_d->a_skip_to_keyframe)3172 { 3173 if (simpleblock)3346 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3347 mkv_track_t *track = NULL; 3348 demux_stream_t *ds = NULL; 3349 uint64_t old_length; 3350 int64_t tc; 3351 uint32_t *lace_size; 3352 uint8_t laces, flags; 3353 int i, num, tmp, use_this_block = 1; 3354 float current_pts; 3355 int16_t time; 3356 3357 /* first byte(s): track num */ 3358 num = ebml_read_vlen_uint (block, &tmp); 3359 block += tmp; 3360 /* time (relative to cluster time) */ 3361 time = block[0] << 8 | block[1]; 3362 block += 2; 3363 length -= tmp + 2; 3364 old_length = length; 3365 flags = block[0]; 3366 if (demux_mkv_read_block_lacing (block, &length, &laces, &lace_size)) 3367 return 0; 3368 block += old_length - length; 3369 3370 tc = ((time*mkv_d->tc_scale+mkv_d->cluster_tc) /1000000.0 - mkv_d->first_tc); 3371 if (tc < 0) 3372 tc = 0; 3373 if (mkv_d->stop_timecode > 0 && tc > mkv_d->stop_timecode) { 3374 free(lace_size); 3375 return -1; 3376 } 3377 current_pts = tc / 1000.0; 3378 3379 clear_subtitles(demuxer, tc, 0); 3380 3381 for (i=0; i<mkv_d->num_tracks; i++) 3382 if (mkv_d->tracks[i]->tnum == num) { 3383 track = mkv_d->tracks[i]; 3384 break; 3385 } 3386 if (track == NULL) 3387 { 3388 free(lace_size); 3389 return 1; 3390 } 3391 if (num == demuxer->audio->id) 3392 { 3393 ds = demuxer->audio; 3394 3395 if (mkv_d->a_skip_to_keyframe) 3396 { 3397 if (simpleblock) 3174 3398 { 3175 3176 3399 if (!(flags&0x80)) /*current frame isn't a keyframe*/ 3400 use_this_block = 0; 3177 3401 } 3178 else if (block_bref != 0) 3402 else if (block_bref != 0) 3403 use_this_block = 0; 3404 } 3405 else if (mkv_d->v_skip_to_keyframe) 3406 use_this_block = 0; 3407 3408 if (track->fix_i_bps && use_this_block) 3409 { 3410 sh_audio_t *sh = (sh_audio_t *) ds->sh; 3411 3412 if (block_duration != 0) 3413 { 3414 sh->i_bps = length * 1000 / block_duration; 3415 track->fix_i_bps = 0; 3416 } 3417 else if (track->qt_last_a_pts == 0.0) 3418 track->qt_last_a_pts = current_pts; 3419 else if(track->qt_last_a_pts != current_pts) 3420 { 3421 sh->i_bps = length / (current_pts - track->qt_last_a_pts); 3422 track->fix_i_bps = 0; 3423 } 3424 } 3425 } 3426 else if (tc < mkv_d->skip_to_timecode) 3427 use_this_block = 0; 3428 else if (num == demuxer->video->id) 3429 { 3430 ds = demuxer->video; 3431 if (mkv_d->v_skip_to_keyframe) 3432 { 3433 if (simpleblock) 3434 { 3435 if (!(flags&0x80)) /*current frame isn't a keyframe*/ 3179 3436 use_this_block = 0; 3180 }3181 else if (mkv_d->v_skip_to_keyframe)3437 } 3438 else if (block_bref != 0 || block_fref != 0) 3182 3439 use_this_block = 0; 3183 3184 if (track->fix_i_bps && use_this_block) 3185 { 3186 sh_audio_t *sh = (sh_audio_t *) ds->sh; 3187 3188 if (block_duration != 0) 3440 } 3441 } 3442 else if (num == demuxer->sub->id) 3443 { 3444 ds = demuxer->sub; 3445 if (track->subtitle_type != MATROSKA_SUBTYPE_VOBSUB) 3446 { 3447 if (!mkv_d->v_skip_to_keyframe) 3448 handle_subtitles (demuxer, track, block, length, 3449 block_duration, tc); 3450 use_this_block = 0; 3451 } 3452 } 3453 else 3454 use_this_block = 0; 3455 3456 if (use_this_block) 3457 { 3458 mkv_d->last_pts = current_pts; 3459 mkv_d->last_filepos = demuxer->filepos; 3460 3461 for (i=0; i < laces; i++) 3462 { 3463 if (ds == demuxer->video && track->realmedia) 3464 handle_realvideo (demuxer, track, block, lace_size[i], block_bref); 3465 else if (ds == demuxer->audio && track->realmedia) 3466 handle_realaudio (demuxer, track, block, lace_size[i], block_bref); 3467 else if (ds == demuxer->video && track->reorder_timecodes) 3468 handle_video_bframes (demuxer, track, block, lace_size[i], 3469 block_bref, block_fref); 3470 else 3189 3471 { 3190 sh->i_bps = length * 1000 / block_duration; 3191 track->fix_i_bps = 0; 3192 } 3193 else if (track->qt_last_a_pts == 0.0) 3194 track->qt_last_a_pts = current_pts; 3195 else if(track->qt_last_a_pts != current_pts) 3196 { 3197 sh->i_bps = length / (current_pts - track->qt_last_a_pts); 3198 track->fix_i_bps = 0; 3199 } 3200 } 3201 } 3202 else if (tc < mkv_d->skip_to_timecode) 3203 use_this_block = 0; 3204 else if (num == demuxer->video->id) 3205 { 3206 ds = demuxer->video; 3207 if (mkv_d->v_skip_to_keyframe) 3208 { 3209 if (simpleblock) 3210 { 3211 if (!(flags&0x80)) /*current frame isn't a keyframe*/ 3212 use_this_block = 0; 3213 } 3214 else if (block_bref != 0 || block_fref != 0) 3215 use_this_block = 0; 3216 } 3217 } 3218 else if (num == demuxer->sub->id) 3219 { 3220 ds = demuxer->sub; 3221 if (track->subtitle_type != MATROSKA_SUBTYPE_VOBSUB) 3222 { 3223 if (!mkv_d->v_skip_to_keyframe) 3224 handle_subtitles (demuxer, track, block, length, 3225 block_duration, tc); 3226 use_this_block = 0; 3227 } 3228 } 3229 else 3230 use_this_block = 0; 3231 3232 if (use_this_block) 3233 { 3234 mkv_d->last_pts = current_pts; 3235 mkv_d->last_filepos = demuxer->filepos; 3236 3237 for (i=0; i < laces; i++) 3238 { 3239 if (ds == demuxer->video && track->realmedia) 3240 handle_realvideo (demuxer, track, block, lace_size[i], block_bref); 3241 else if (ds == demuxer->audio && track->realmedia) 3242 handle_realaudio (demuxer, track, block, lace_size[i], block_bref); 3243 else if (ds == demuxer->video && track->reorder_timecodes) 3244 handle_video_bframes (demuxer, track, block, lace_size[i], 3245 block_bref, block_fref); 3246 else 3247 { 3248 int modified, size = lace_size[i]; 3249 demux_packet_t *dp; 3250 uint8_t *buffer; 3251 modified = demux_mkv_decode (track, block, &buffer, &size, 1); 3252 if (buffer) 3472 int modified, size = lace_size[i]; 3473 demux_packet_t *dp; 3474 uint8_t *buffer; 3475 modified = demux_mkv_decode (track, block, &buffer, &size, 1); 3476 if (buffer) 3253 3477 { 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3478 dp = new_demux_packet (size); 3479 memcpy (dp->buffer, buffer, size); 3480 if (modified) 3481 free (buffer); 3482 dp->flags = (block_bref == 0 && block_fref == 0) ? 0x10 : 0; 3483 /* If default_duration is 0, assume no pts value is known 3484 * for packets after the first one (rather than all pts 3485 * values being the same) */ 3486 if (i == 0 || track->default_duration) 3487 dp->pts = mkv_d->last_pts + i * track->default_duration; 3488 ds_add_packet (ds, dp); 3265 3489 } 3266 3490 } 3267 3268 } 3269 3270 3271 { 3272 3273 3274 } 3275 3276 3277 3278 3279 3280 } 3281 3282 3283 3491 block += lace_size[i]; 3492 } 3493 3494 if (ds == demuxer->video) 3495 { 3496 mkv_d->v_skip_to_keyframe = 0; 3497 mkv_d->skip_to_timecode = 0; 3498 } 3499 else if (ds == demuxer->audio) 3500 mkv_d->a_skip_to_keyframe = 0; 3501 3502 free(lace_size); 3503 return 1; 3504 } 3505 3506 free(lace_size); 3507 return 0; 3284 3508 } 3285 3509 … … 3287 3511 demux_mkv_fill_buffer (demuxer_t *demuxer, demux_stream_t *ds) 3288 3512 { 3289 3290 3291 3292 3293 3294 3295 { 3296 3297 { 3298 3299 3300 3301 3302 3513 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3514 stream_t *s = demuxer->stream; 3515 uint64_t l; 3516 int il, tmp; 3517 3518 while (1) 3519 { 3520 while (mkv_d->cluster_size > 0) 3521 { 3522 uint64_t block_duration = 0, block_length = 0; 3523 int64_t block_bref = 0, block_fref = 0; 3524 uint8_t *block = NULL; 3525 3526 while (mkv_d->blockgroup_size > 0) 3303 3527 { 3304 3528 switch (ebml_read_id (s, &il)) 3305 3529 { 3306 3530 case MATROSKA_ID_BLOCKDURATION: 3307 3308 3309 3310 3311 3312 3313 3531 { 3532 block_duration = ebml_read_uint (s, &l); 3533 if (block_duration == EBML_UINT_INVALID) 3534 return 0; 3535 block_duration *= mkv_d->tc_scale / 1000000.0; 3536 break; 3537 } 3314 3538 3315 3539 case MATROSKA_ID_BLOCK: 3540 block_length = ebml_read_length (s, &tmp); 3541 free(block); 3542 block = malloc (block_length); 3543 demuxer->filepos = stream_tell (s); 3544 if (stream_read (s,block,block_length) != (int) block_length) 3545 { 3546 free(block); 3547 return 0; 3548 } 3549 l = tmp + block_length; 3550 break; 3551 3552 case MATROSKA_ID_REFERENCEBLOCK: 3553 { 3554 int64_t num = ebml_read_int (s, &l); 3555 if (num == EBML_INT_INVALID) 3556 return 0; 3557 if (num <= 0) 3558 block_bref = num; 3559 else 3560 block_fref = num; 3561 break; 3562 } 3563 3564 case EBML_ID_INVALID: 3565 return 0; 3566 3567 default: 3568 ebml_read_skip (s, &l); 3569 break; 3570 } 3571 mkv_d->blockgroup_size -= l + il; 3572 mkv_d->cluster_size -= l + il; 3573 } 3574 3575 if (block) 3576 { 3577 int res = handle_block (demuxer, block, block_length, 3578 block_duration, block_bref, block_fref, 0); 3579 free (block); 3580 if (res < 0) 3581 return 0; 3582 if (res) 3583 return 1; 3584 } 3585 3586 if (mkv_d->cluster_size > 0) 3587 { 3588 switch (ebml_read_id (s, &il)) 3589 { 3590 case MATROSKA_ID_CLUSTERTIMECODE: 3591 { 3592 uint64_t num = ebml_read_uint (s, &l); 3593 if (num == EBML_UINT_INVALID) 3594 return 0; 3595 if (!mkv_d->has_first_tc) 3596 { 3597 mkv_d->first_tc = num * mkv_d->tc_scale / 1000000.0; 3598 mkv_d->has_first_tc = 1; 3599 } 3600 mkv_d->cluster_tc = num * mkv_d->tc_scale; 3601 break; 3602 } 3603 3604 case MATROSKA_ID_BLOCKGROUP: 3605 mkv_d->blockgroup_size = ebml_read_length (s, &tmp); 3606 l = tmp; 3607 break; 3608 3609 case MATROSKA_ID_SIMPLEBLOCK: 3610 { 3611 int res; 3316 3612 block_length = ebml_read_length (s, &tmp); 3317 free(block); 3318 block = (uint8_t *) malloc (block_length); 3613 block = malloc (block_length); 3319 3614 demuxer->filepos = stream_tell (s); 3320 3615 if (stream_read (s,block,block_length) != (int) block_length) 3321 3616 { 3322 3323 3617 free(block); 3618 return 0; 3324 3619 } 3325 3620 l = tmp + block_length; 3621 res = handle_block (demuxer, block, block_length, 3622 block_duration, block_bref, block_fref, 1); 3623 free (block); 3624 mkv_d->cluster_size -= l + il; 3625 if (res < 0) 3626 return 0; 3627 else if (res) 3628 return 1; 3629 else mkv_d->cluster_size += l + il; 3326 3630 break; 3327 3328 case MATROSKA_ID_REFERENCEBLOCK: 3329 { 3330 int64_t num = ebml_read_int (s, &l); 3331 if (num == EBML_INT_INVALID) 3332 return 0; 3333 if (num <= 0) 3334 block_bref = num; 3335 else 3336 block_fref = num; 3337 break; 3338 } 3339 3631 } 3340 3632 case EBML_ID_INVALID: 3341 3633 return 0; 3342 3634 3343 3635 default: 3344 3345 3636 ebml_read_skip (s, &l); 3637 break; 3346 3638 } 3347 mkv_d->blockgroup_size -= l + il; 3348 mkv_d->cluster_size -= l + il; 3639 mkv_d->cluster_size -= l + il; 3349 3640 } 3350 3351 if (block) 3641 } 3642 3643 if (ebml_read_id (s, &il) != MATROSKA_ID_CLUSTER) 3644 return 0; 3645 add_cluster_position(mkv_d, stream_tell(s)-il); 3646 mkv_d->cluster_size = ebml_read_length (s, NULL); 3647 } 3648 3649 return 0; 3650 } 3651 3652 static void 3653 demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) 3654 { 3655 free_cached_dps (demuxer); 3656 if (!(flags & 2)) /* time in secs */ 3657 { 3658 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3659 stream_t *s = demuxer->stream; 3660 int64_t target_timecode = 0, diff, min_diff=0xFFFFFFFL; 3661 int i; 3662 3663 if (!(flags & 1)) /* relative seek */ 3664 target_timecode = (int64_t) (mkv_d->last_pts * 1000.0); 3665 target_timecode += (int64_t)(rel_seek_secs * 1000.0); 3666 if (target_timecode < 0) 3667 target_timecode = 0; 3668 3669 if (mkv_d->indexes == NULL) /* no index was found */ 3670 { 3671 uint64_t target_filepos, cluster_pos, max_pos; 3672 3673 target_filepos = (uint64_t) (target_timecode * mkv_d->last_filepos 3674 / (mkv_d->last_pts * 1000.0)); 3675 3676 max_pos = mkv_d->cluster_positions[mkv_d->num_cluster_pos-1]; 3677 if (target_filepos > max_pos) 3352 3678 { 3353 int res = handle_block (demuxer, block, block_length, 3354 block_duration, block_bref, block_fref, 0); 3355 free (block); 3356 if (res < 0) 3357 return 0; 3358 if (res) 3359 return 1; 3360 } 3361 3362 if (mkv_d->cluster_size > 0) 3363 { 3364 switch (ebml_read_id (s, &il)) 3679 if ((off_t) max_pos > stream_tell (s)) 3680 stream_seek (s, max_pos); 3681 else 3682 stream_seek (s, stream_tell (s) + mkv_d->cluster_size); 3683 /* parse all the clusters upto target_filepos */ 3684 while (!s->eof && stream_tell(s) < (off_t) target_filepos) 3365 3685 { 3366 case MATROSKA_ID_CLUSTERTIMECODE: 3367 { 3368 uint64_t num = ebml_read_uint (s, &l); 3369 if (num == EBML_UINT_INVALID) 3370 return 0; 3371 if (!mkv_d->has_first_tc) 3372 { 3373 mkv_d->first_tc = num * mkv_d->tc_scale / 1000000.0; 3374 mkv_d->has_first_tc = 1; 3375 } 3376 mkv_d->cluster_tc = num * mkv_d->tc_scale; 3377 break; 3378 } 3379 3380 case MATROSKA_ID_BLOCKGROUP: 3381 mkv_d->blockgroup_size = ebml_read_length (s, &tmp); 3382 l = tmp; 3383 break; 3384 3385 case MATROSKA_ID_SIMPLEBLOCK: 3386 { 3387 int res; 3388 block_length = ebml_read_length (s, &tmp); 3389 block = (uint8_t *) malloc (block_length); 3390 demuxer->filepos = stream_tell (s); 3391 if (stream_read (s,block,block_length) != (int) block_length) 3392 { 3393 free(block); 3394 return 0; 3395 } 3396 l = tmp + block_length; 3397 res = handle_block (demuxer, block, block_length, 3398 block_duration, block_bref, block_fref, 1); 3399 free (block); 3400 mkv_d->cluster_size -= l + il; 3401 if (res < 0) 3402 return 0; 3403 else if (res) 3404 return 1; 3405 else mkv_d->cluster_size += l + il; 3406 break; 3407 } 3408 case EBML_ID_INVALID: 3409 return 0; 3410 3411 default: 3412 ebml_read_skip (s, &l); 3413 break; 3414 } 3415 mkv_d->cluster_size -= l + il; 3416 } 3417 } 3418 3419 if (ebml_read_id (s, &il) != MATROSKA_ID_CLUSTER) 3420 return 0; 3421 add_cluster_position(mkv_d, stream_tell(s)-il); 3422 mkv_d->cluster_size = ebml_read_length (s, NULL); 3423 } 3424 3425 return 0; 3426 } 3427 3428 static void 3429 demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, /*float audio_delay, */int flags) 3430 { 3431 free_cached_dps (demuxer); 3432 if (!(flags & 2)) /* time in secs */ 3433 { 3434 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3435 stream_t *s = demuxer->stream; 3436 int64_t target_timecode = 0, diff, min_diff=0xFFFFFFFL; 3437 int i; 3438 3439 if (!(flags & 1)) /* relative seek */ 3440 target_timecode = (int64_t) (mkv_d->last_pts * 1000.0); 3441 target_timecode += (int64_t)(rel_seek_secs * 1000.0); 3442 if (target_timecode < 0) 3443 target_timecode = 0; 3444 3445 if (mkv_d->indexes == NULL) /* no index was found */ 3446 { 3447 uint64_t target_filepos, cluster_pos, max_pos; 3448 3449 target_filepos = (uint64_t) (target_timecode * mkv_d->last_filepos 3450 / (mkv_d->last_pts * 1000.0)); 3451 3452 max_pos = mkv_d->cluster_positions[mkv_d->num_cluster_pos-1]; 3453 if (target_filepos > max_pos) 3454 { 3455 if ((off_t) max_pos > stream_tell (s)) 3456 stream_seek (s, max_pos); 3457 else 3458 stream_seek (s, stream_tell (s) + mkv_d->cluster_size); 3459 /* parse all the clusters upto target_filepos */ 3460 while (!s->eof && stream_tell(s) < (off_t) target_filepos) 3461 { 3462 switch (ebml_read_id (s, &i)) 3686 switch (ebml_read_id (s, &i)) 3463 3687 { 3464 3688 case MATROSKA_ID_CLUSTER: 3465 3466 3689 add_cluster_position(mkv_d, (uint64_t) stream_tell(s)-i); 3690 break; 3467 3691 3468 3692 case MATROSKA_ID_CUES: 3469 3470 3693 demux_mkv_read_cues (demuxer); 3694 break; 3471 3695 } 3472 3696 ebml_read_skip (s, NULL); 3473 3697 } 3474 3475 3698 if (s->eof) 3699 stream_reset(s); 3476 3700 } 3477 3701 3478 3702 if (mkv_d->indexes == NULL) 3479 3703 { 3480 3481 3482 3704 cluster_pos = mkv_d->cluster_positions[0]; 3705 /* Let's find the nearest cluster */ 3706 for (i=0; i < mkv_d->num_cluster_pos; i++) 3483 3707 { 3484 3485 3708 diff = mkv_d->cluster_positions[i] - target_filepos; 3709 if (rel_seek_secs < 0 && diff < 0 && -diff < min_diff) 3486 3710 { 3487 3488 3711 cluster_pos = mkv_d->cluster_positions[i]; 3712 min_diff = -diff; 3489 3713 } 3490 3491 3714 else if (rel_seek_secs > 0 3715 && (diff < 0 ? -1 * diff : diff) < min_diff) 3492 3716 { 3493 3494 3717 cluster_pos = mkv_d->cluster_positions[i]; 3718 min_diff = diff < 0 ? -1 * diff : diff; 3495 3719 } 3496 3720 } 3497 3498 3721 mkv_d->cluster_size = mkv_d->blockgroup_size = 0; 3722 stream_seek (s, cluster_pos); 3499 3723 } 3500 3724 } 3501 else 3502 { 3503 mkv_index_t *index = NULL; 3504 3505 /* let's find the entry in the indexes with the smallest */ 3506 /* difference to the wanted timecode. */ 3507 for (i=0; i < mkv_d->num_indexes; i++) 3508 if (mkv_d->indexes[i].tnum == demuxer->video->id) 3509 { 3510 diff = target_timecode + mkv_d->first_tc - 3511 (int64_t) mkv_d->indexes[i].timecode * mkv_d->tc_scale / 1000000.0; 3512 3513 if ((flags & 1 || target_timecode <= mkv_d->last_pts*1000) 3514 && diff >= 0 && diff < min_diff) 3515 { 3516 min_diff = diff; 3517 index = mkv_d->indexes + i; 3518 } 3519 else if (target_timecode > mkv_d->last_pts*1000 3520 && diff < 0 && -diff < min_diff) 3521 { 3522 min_diff = -diff; 3523 index = mkv_d->indexes + i; 3524 } 3525 } 3526 3527 if (index) /* We've found an entry. */ 3725 else 3726 { 3727 mkv_index_t *index = NULL; 3728 int seek_id = (demuxer->video->id < 0) ? demuxer->audio->id : demuxer->video->id; 3729 3730 /* let's find the entry in the indexes with the smallest */ 3731 /* difference to the wanted timecode. */ 3732 for (i=0; i < mkv_d->num_indexes; i++) 3733 if (mkv_d->indexes[i].tnum == seek_id) 3734 { 3735 diff = target_timecode + mkv_d->first_tc - 3736 (int64_t) mkv_d->indexes[i].timecode * mkv_d->tc_scale / 1000000.0; 3737 3738 if ((flags & 1 || target_timecode <= mkv_d->last_pts*1000) 3739 && diff >= 0 && diff < min_diff) 3740 { 3741 min_diff = diff; 3742 index = mkv_d->indexes + i; 3743 } 3744 else if (target_timecode > mkv_d->last_pts*1000 3745 && diff < 0 && -diff < min_diff) 3746 { 3747 min_diff = -diff; 3748 index = mkv_d->indexes + i; 3749 } 3750 } 3751 3752 if (index) /* We've found an entry. */ 3528 3753 { 3529 3530 3754 mkv_d->cluster_size = mkv_d->blockgroup_size = 0; 3755 stream_seek (s, index->filepos); 3531 3756 } 3532 3757 } 3533 3758 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 } 3546 3547 dprintf("[mkv] seek unsupported flags\n");3548 3549 { 3550 3551 3552 3553 3554 3555 3556 3759 if (demuxer->video->id >= 0) 3760 mkv_d->v_skip_to_keyframe = 1; 3761 if (rel_seek_secs > 0.0) 3762 mkv_d->skip_to_timecode = target_timecode; 3763 mkv_d->a_skip_to_keyframe = 1; 3764 3765 /* Clear subtitles. */ 3766 if (target_timecode <= mkv_d->last_pts * 1000) 3767 clear_subtitles(demuxer, 0, 1); 3768 3769 demux_mkv_fill_buffer(demuxer, NULL); 3770 } 3771 else if ((demuxer->movi_end <= 0) || !(flags & 1)) 3772 dprintf("[mkv] seek unsupported flags\n"); 3773 else 3774 { 3775 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3776 stream_t *s = demuxer->stream; 3777 uint64_t target_filepos; 3778 mkv_index_t *index = NULL; 3779 int i; 3780 3781 if (mkv_d->indexes == NULL) /* no index was found */ 3557 3782 { /* I'm lazy... */ 3558 dprintf("[mkv] seek unsupported flags\n");3559 3560 } 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3783 dprintf("[mkv] seek unsupported flags\n"); 3784 return; 3785 } 3786 3787 target_filepos = (uint64_t)(demuxer->movi_end * rel_seek_secs); 3788 for (i=0; i < mkv_d->num_indexes; i++) 3789 if (mkv_d->indexes[i].tnum == demuxer->video->id) 3790 if ((index == NULL) || 3791 ((mkv_d->indexes[i].filepos >= target_filepos) && 3792 ((index->filepos < target_filepos) || 3793 (mkv_d->indexes[i].filepos < index->filepos)))) 3794 index = &mkv_d->indexes[i]; 3795 3796 if (!index) 3797 return; 3798 3799 mkv_d->cluster_size = mkv_d->blockgroup_size = 0; 3800 stream_seek (s, index->filepos); 3801 3802 if (demuxer->video->id >= 0) 3803 mkv_d->v_skip_to_keyframe = 1; 3804 mkv_d->skip_to_timecode = index->timecode; 3805 mkv_d->a_skip_to_keyframe = 1; 3806 3807 /* Clear subtitles. */ 3808 if (index->timecode <= mkv_d->last_pts * 1000) 3809 clear_subtitles(demuxer, 0, 1); 3810 3811 demux_mkv_fill_buffer(demuxer, NULL); 3587 3812 } 3588 3813 } … … 3591 3816 demux_mkv_control (demuxer_t *demuxer, int cmd, void *arg) 3592 3817 { 3593 3594 3595 3818 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3819 3820 switch (cmd) 3596 3821 { 3597 3822 case DEMUXER_CTRL_GET_TIME_LENGTH: 3598 if (mkv_d->duration == 0) 3823 if (mkv_d->duration == 0) 3824 return DEMUXER_CTRL_DONTKNOW; 3825 3826 *((double *)arg) = (double)mkv_d->duration; 3827 return DEMUXER_CTRL_OK; 3828 3829 case DEMUXER_CTRL_GET_PERCENT_POS: 3830 if (mkv_d->duration == 0) 3831 { 3599 3832 return DEMUXER_CTRL_DONTKNOW; 3600 3601 *((double *)arg) = (double)mkv_d->duration; 3602 return DEMUXER_CTRL_OK; 3603 3604 case DEMUXER_CTRL_GET_PERCENT_POS: 3605 if (mkv_d->duration == 0) 3606 { 3607 return DEMUXER_CTRL_DONTKNOW; 3608 } 3609 3610 *((int *) arg) = (int) (100 * mkv_d->last_pts / mkv_d->duration); 3611 return DEMUXER_CTRL_OK; 3833 } 3834 3835 *((int *) arg) = (int) (100 * mkv_d->last_pts / mkv_d->duration); 3836 return DEMUXER_CTRL_OK; 3612 3837 3613 3838 case DEMUXER_CTRL_SWITCH_AUDIO: 3614 if (demuxer->audio && demuxer->audio->sh) { 3615 int i; 3616 demux_stream_t *d_audio = demuxer->audio; 3617 int idx = d_audio->id - 1; // track ids are 1 based 3618 mkv_track_t *otrack = mkv_d->tracks[idx]; 3619 mkv_track_t *track = 0; 3620 if (*((int*)arg) < 0) 3621 for(i = 0; i < mkv_d->last_aid; i++) { 3622 if(mkv_d->audio_tracks[i] == d_audio->id) { 3623 idx = mkv_d->audio_tracks[(i+1) % mkv_d->last_aid] - 1; 3624 track = mkv_d->tracks[idx]; 3625 if(! track) 3626 continue; 3627 if (track->type == MATROSKA_TRACK_AUDIO) break; 3628 } 3629 } 3630 else { 3631 track = demux_mkv_find_track_by_num (mkv_d, *((int*)arg), MATROSKA_TRACK_AUDIO); 3632 if (track == NULL) 3633 track = otrack; 3634 } 3635 if (track != otrack) { 3636 d_audio->id = track->tnum; 3637 ds_free_packs(d_audio); 3638 } 3639 } 3640 *((int*)arg) = demuxer->audio->id; 3641 return DEMUXER_CTRL_OK; 3839 if (demuxer->audio && demuxer->audio->sh) { 3840 sh_audio_t *sh = demuxer->a_streams[demuxer->audio->id]; 3841 int aid = *(int*)arg; 3842 if (aid < 0) 3843 aid = (sh->aid + 1) % mkv_d->last_aid; 3844 if (aid != sh->aid) { 3845 mkv_track_t *track = demux_mkv_find_track_by_num (mkv_d, aid, MATROSKA_TRACK_AUDIO); 3846 if (track) { 3847 demuxer->audio->id = track->tnum; 3848 sh = demuxer->a_streams[demuxer->audio->id]; 3849 ds_free_packs(demuxer->audio); 3850 } 3851 } 3852 *(int*)arg = sh->aid; 3853 } else 3854 *(int*)arg = -2; 3855 return DEMUXER_CTRL_OK; 3642 3856 3643 3857 default: 3644 return DEMUXER_CTRL_NOTIMPL; 3645 } 3646 } 3647 3648 /** \brief Return the number of subtitle tracks in the file. 3649 3650 \param demuxer The demuxer for which the number of subtitle tracks 3651 should be returned. 3652 */ 3653 int 3654 demux_mkv_num_subs (demuxer_t *demuxer) 3655 { 3656 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3657 int i, num; 3658 3659 num = 0; 3660 for (i = 0; i < mkv_d->num_tracks; i++) 3661 if ((mkv_d->tracks[i]->type == MATROSKA_TRACK_SUBTITLE) && 3662 (mkv_d->tracks[i]->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN)) 3663 num++; 3664 3665 return num; 3858 return DEMUXER_CTRL_NOTIMPL; 3859 } 3666 3860 } 3667 3861 3668 3862 /** \brief Change the current subtitle track and return its ID. 3669 3863 3670 Changes the current subtitle track. If the new subtitle track is a3671 VobSub track then the SPU decoder will be re-initialized.3672 3673 \param demuxer The demuxer whose subtitle track will be changed.3674 \param new_num The number of the new subtitle track. The number must be3675 between 0 and demux_mkv_num_subs - 1.3676 3677 \returns The Matroska track number of the newly selected track.3864 Changes the current subtitle track. If the new subtitle track is a 3865 VobSub track then the SPU decoder will be re-initialized. 3866 3867 \param demuxer The demuxer whose subtitle track will be changed. 3868 \param new_num The number of the new subtitle track. The number must be 3869 between 0 and demux_mkv_num_subs - 1. 3870 3871 \returns The Matroska track number of the newly selected track. 3678 3872 */ 3679 3873 int 3680 3874 demux_mkv_change_subs (demuxer_t *demuxer, int new_num) 3681 3875 { 3682 3683 3684 3685 3686 3687 3688 3689 { 3690 3691 3692 3693 3694 { 3695 3696 3697 } 3698 } 3699 3700 3701 3702 3703 demuxer->sub->sh = malloc(sizeof(mkv_sh_sub_t));3704 3705 memcpy(demuxer->sub->sh, &track->sh_sub, sizeof(mkv_sh_sub_t));3706 3707 3876 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3877 mkv_track_t *track; 3878 int i, num; 3879 3880 num = 0; 3881 track = NULL; 3882 for (i = 0; i < mkv_d->num_tracks; i++) 3883 { 3884 if ((mkv_d->tracks[i]->type == MATROSKA_TRACK_SUBTITLE) && 3885 (mkv_d->tracks[i]->subtitle_type != MATROSKA_SUBTYPE_UNKNOWN)) 3886 num++; 3887 if (num == (new_num + 1)) 3888 { 3889 track = mkv_d->tracks[i]; 3890 break; 3891 } 3892 } 3893 if (track == NULL) 3894 return -1; 3895 3896 if (demuxer->sub->sh == NULL) 3897 demuxer->sub->sh = malloc(sizeof(sh_sub_t)); 3898 if (demuxer->sub->sh != NULL) 3899 memcpy(demuxer->sub->sh, &track->sh_sub, sizeof(sh_sub_t)); 3900 3901 return track->tnum; 3708 3902 } 3709 3903 3710 3904 /** \brief Get the language code for a subtitle track. 3711 3905 3712 Retrieves the language code for a subtitle track if it is known.3713 If the language code is "und" then do not copy it ("und" = "undefined").3714 3715 \param demuxer The demuxer to work on3716 \param track_num The n'th subtitle track to get the language from3717 \param lang Store the language here3718 \param maxlen The maximum number of characters to copy into lang3906 Retrieves the language code for a subtitle track if it is known. 3907 If the language code is "und" then do not copy it ("und" = "undefined"). 3908 3909 \param demuxer The demuxer to work on 3910 \param track_num The n'th subtitle track to get the language from 3911 \param lang Store the language here 3912 \param maxlen The maximum number of characters to copy into lang 3719 3913 */ 3720 3914 void … … 3722 3916 int maxlen) 3723 3917 { 3724 3725 3726 3727 3918 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3919 mkv_track_t *track = demux_mkv_find_track_by_num (mkv_d, track_num, MATROSKA_TRACK_SUBTITLE); 3920 if (track->language && strcmp(track->language, "und")) 3921 strlcpy(lang, track->language, maxlen); 3728 3922 } 3729 3923 3730 3924 /** \brief Get the language code for an audio track. 3731 3925 3732 Retrieves the language code for an audio track if it is known.3733 If the language code is "und" then do not copy it ("und" = "undefined").3734 3735 \param demuxer The demuxer to work on3736 \param track_num The n'th audio track to get the language from3737 \param lang Store the language here3738 \param maxlen The maximum number of characters to copy into lang3926 Retrieves the language code for an audio track if it is known. 3927 If the language code is "und" then do not copy it ("und" = "undefined"). 3928 3929 \param demuxer The demuxer to work on 3930 \param track_num The n'th audio track to get the language from 3931 \param lang Store the language here 3932 \param maxlen The maximum number of characters to copy into lang 3739 3933 */ 3740 3934 void 3741 3935 demux_mkv_get_audio_lang(demuxer_t *demuxer, int track_num, char *lang, 3742 3743 { 3744 3745 3746 3747 3936 int maxlen) 3937 { 3938 mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; 3939 mkv_track_t *track = demux_mkv_find_track_by_num (mkv_d, track_num, MATROSKA_TRACK_AUDIO); 3940 if (track->language && strcmp(track->language, "und")) 3941 strlcpy(lang, track->language, maxlen); 3748 3942 } 3749 3943 3750 3944 3751 3945 demuxer_desc_t demuxer_desc_matroska = { 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3946 "Matroska demuxer", 3947 "mkv", 3948 "Matroska", 3949 "Aurelien Jacobs", 3950 "based on gstreamer demuxer by Ronald Bultje and demux_mkv.cpp by Moritz Bunkus", 3951 DEMUXER_TYPE_MATROSKA, 3952 1, // safe autodetect 3953 demux_mkv_open, 3954 demux_mkv_fill_buffer, 3955 NULL, 3956 demux_close_mkv, 3957 demux_mkv_seek, 3958 demux_mkv_control 3765 3959 }; -
TabularUnified trunk/libmpdemux/demux_mov.c ¶
r181 r263 31 31 #include "stheader.h" 32 32 33 #include "subreader.h" 34 35 extern subtitle* vo_sub; 36 int vo_osd_changed(int new_value); 37 #define OSDTYPE_OSD 1 38 #define OSDTYPE_SUBTITLE 2 39 #define OSDTYPE_PROGBAR 3 40 #define OSDTYPE_SPU 4 41 33 42 #include "bswap.h" 34 43 … … 53 62 54 63 #define BE_16(x) (((unsigned char *)(x))[0] << 8 | \ 55 64 ((unsigned char *)(x))[1]) 56 65 #define BE_32(x) (((unsigned char *)(x))[0] << 24 | \ 57 58 59 66 ((unsigned char *)(x))[1] << 16 | \ 67 ((unsigned char *)(x))[2] << 8 | \ 68 ((unsigned char *)(x))[3]) 60 69 61 70 #define char2short(x,y) BE_16(&(x)[(y)]) … … 164 173 if (trak->chunks_size <= 0) 165 174 { 166 167 168 169 170 171 172 175 dprintf(MSGT_DEMUX, "No chunk offset table, trying to build one!\n"); 176 177 trak->chunks_size = trak->samples_size; /* XXX: FIXME ! */ 178 trak->chunks = realloc(trak->chunks, sizeof(mov_chunk_t)*trak->chunks_size); 179 180 for (i=0; i < trak->chunks_size; i++) 181 trak->chunks[i].pos = -1; 173 182 } 174 183 #endif … … 180 189 i=trak->chunkmap_size; 181 190 while(i>0){ 182 183 184 185 186 187 191 --i; 192 for(j=trak->chunkmap[i].first;j<last;j++){ 193 trak->chunks[j].desc=trak->chunkmap[i].sdid; 194 trak->chunks[j].size=trak->chunkmap[i].spc; 195 } 196 last=trak->chunkmap[i].first; 188 197 } 189 198 … … 191 200 for (i=0; i < trak->chunks_size; i++) 192 201 { 193 194 195 196 197 198 202 /* fixup position */ 203 if (trak->chunks[i].pos == -1) 204 if (i > 0) 205 trak->chunks[i].pos = trak->chunks[i-1].pos + trak->chunks[i-1].size; 206 else 207 trak->chunks[i].pos = 0; /* FIXME: set initial pos */ 199 208 #endif 200 209 201 // calc pts of chunks: 202 s=0; 203 for(j=0;j<trak->chunks_size;j++){ 204 trak->chunks[j].sample=s; 205 s+=trak->chunks[j].size; 210 // calc pts of chunks: 211 s=0; 212 for(j=0;j<trak->chunks_size;j++){ 213 trak->chunks[j].sample=s; 214 s+=trak->chunks[j].size; 215 } 216 i = 0; 217 for (j = 0; j < trak->durmap_size; j++) 218 i += trak->durmap[j].num; 219 if (i != s) { 220 dprintf("MOV: durmap and chunkmap sample count differ (%i vs %i)\n", i, s); 221 if (i > s) s = i; 222 } 223 224 // workaround for fixed-size video frames (dv and uncompressed) 225 if(!trak->samples_size && trak->type!=MOV_TRAK_AUDIO){ 226 trak->samples_size=s; 227 trak->samples=calloc(s, sizeof(mov_sample_t)); 228 for(i=0;i<s;i++) 229 trak->samples[i].size=trak->samplesize; 230 trak->samplesize=0; 231 } 232 233 if(!trak->samples_size){ 234 // constant sampesize 235 if(trak->durmap_size==1 || (trak->durmap_size==2 && trak->durmap[1].num==1)){ 236 trak->duration=trak->durmap[0].dur; 237 } else dprintf("*** constant samplesize & variable duration not yet supported! ***\nContact the author if you have such sample file!\n"); 238 return; 239 } 240 241 if (trak->samples_size < s) { 242 dprintf("MOV: durmap or chunkmap bigger than sample count (%i vs %i)\n", 243 s, trak->samples_size); 244 trak->samples_size = s; 245 trak->samples = realloc_struct(trak->samples, s, sizeof(mov_sample_t)); 246 } 247 248 // calc pts: 249 s=0; 250 for(j=0;j<trak->durmap_size;j++){ 251 for(i=0;i<trak->durmap[j].num;i++){ 252 trak->samples[s].pts=pts; 253 ++s; 254 pts+=trak->durmap[j].dur; 255 } 256 } 257 258 // calc sample offsets 259 s=0; 260 for(j=0;j<trak->chunks_size;j++){ 261 off_t pos=trak->chunks[j].pos; 262 for(i=0;i<trak->chunks[j].size;i++){ 263 trak->samples[s].pos=pos; 264 dprintf( "Sample %5d: pts=%8d off=0x%08X size=%d\n",s, 265 trak->samples[s].pts, 266 (int)trak->samples[s].pos, 267 trak->samples[s].size); 268 pos+=trak->samples[s].size; 269 ++s; 270 } 271 } 272 273 // precalc editlist entries 274 if(trak->editlist_size>0){ 275 int frame=0; 276 int e_pts=0; 277 for(i=0;i<trak->editlist_size;i++){ 278 mov_editlist_t* el=&trak->editlist[i]; 279 int sample=0; 280 int pts=el->pos; 281 el->start_frame=frame; 282 if(pts<0){ 283 // skip! 284 el->frames=0; continue; 285 } 286 // find start sample 287 for(;sample<trak->samples_size;sample++){ 288 if(pts<=trak->samples[sample].pts) break; 289 } 290 el->start_sample=sample; 291 el->pts_offset=((long long)e_pts*(long long)trak->timescale)/(long long)timescale-trak->samples[sample].pts; 292 pts+=((long long)el->dur*(long long)trak->timescale)/(long long)timescale; 293 e_pts+=el->dur; 294 // find end sample 295 for(;sample<trak->samples_size;sample++){ 296 if(pts<trak->samples[sample].pts) break; 297 } 298 el->frames=sample-el->start_sample; 299 frame+=el->frames; 300 dprintf("EL#%d: pts=%d 1st_sample=%d frames=%d (%5.3fs) pts_offs=%d\n",i, 301 el->pos,el->start_sample, el->frames, 302 (float)(el->dur)/(float)timescale, el->pts_offset); 303 } 304 } 206 305 } 207 i = 0; 208 for (j = 0; j < trak->durmap_size; j++) 209 i += trak->durmap[j].num; 210 if (i != s) { 211 dprintf( 212 "MOV: durmap and chunkmap sample count differ (%i vs %i)\n", i, s); 213 if (i > s) s = i; 306 307 #define MOV_MAX_TRACKS 256 308 #define MOV_MAX_SUBLEN 1024 309 310 typedef struct { 311 off_t moov_start; 312 off_t moov_end; 313 off_t mdat_start; 314 off_t mdat_end; 315 int track_db; 316 mov_track_t* tracks[MOV_MAX_TRACKS]; 317 int timescale; // movie timescale 318 int duration; // movie duration (in movie timescale units) 319 subtitle subs; 320 char subtext[MOV_MAX_SUBLEN + 1]; 321 int current_sub; 322 } mov_priv_t; 323 324 #define MOV_FOURCC(a,b,c,d) ((a<<24)|(b<<16)|(c<<8)|(d)) 325 326 static int mov_check_file(demuxer_t* demuxer){ 327 int flags=0; 328 int no=0; 329 mov_priv_t* priv=malloc(sizeof(mov_priv_t)); 330 331 dprintf("Checking for MOV\n"); 332 333 memset(priv,0,sizeof(mov_priv_t)); 334 priv->current_sub = -1; 335 336 while(1){ 337 int i; 338 int skipped=8; 339 off_t len=stream_read_dword(demuxer->stream); 340 unsigned int id=stream_read_dword(demuxer->stream); 341 if(stream_eof(demuxer->stream)) break; // EOF 342 if (len == 1) /* real size is 64bits - cjb */ 343 { 344 #ifndef _LARGEFILE_SOURCE 345 if (stream_read_dword(demuxer->stream) != 0) 346 dprintf( "64bit file, but you've compiled MPlayer without LARGEFILE support!\n"); 347 len = stream_read_dword(demuxer->stream); 348 #else 349 len = stream_read_qword(demuxer->stream); 350 #endif 351 skipped += 8; 352 } 353 #if 0 354 else if (len == 0) /* deleted chunk */ 355 { 356 /* XXX: CJB! is this right? - alex */ 357 goto skip_chunk; 358 } 359 #endif 360 else if(len<8) break; // invalid chunk 361 362 switch(id){ 363 case MOV_FOURCC('f','t','y','p'): { 364 unsigned int tmp; 365 // File Type Box (ftyp): 366 // char[4] major_brand (eg. 'isom') 367 // int minor_version (eg. 0x00000000) 368 // char[4] compatible_brands[] (eg. 'mp41') 369 // compatible_brands list spans to the end of box 370 #if 1 371 tmp = stream_read_dword(demuxer->stream); 372 switch(tmp) { 373 case MOV_FOURCC('i','s','o','m'): 374 dprintf("ISO: File Type Major Brand: ISO Base Media\n"); 375 break; 376 case MOV_FOURCC('m','p','4','1'): 377 dprintf("ISO: File Type Major Brand: ISO/IEC 14496-1 (MPEG-4 system) v1\n"); 378 break; 379 case MOV_FOURCC('m','p','4','2'): 380 dprintf("ISO: File Type Major Brand: ISO/IEC 14496-1 (MPEG-4 system) v2\n"); 381 break; 382 case MOV_FOURCC('M','4','A',' '): 383 dprintf("ISO: File Type Major Brand: Apple iTunes AAC-LC Audio\n"); 384 break; 385 case MOV_FOURCC('M','4','P',' '): 386 dprintf("ISO: File Type Major Brand: Apple iTunes AAC-LC Protected Audio\n"); 387 break; 388 case MOV_FOURCC('q','t',' ',' '): 389 dprintf("ISO: File Type Major Brand: Original QuickTime\n"); 390 break; 391 case MOV_FOURCC('3','g','p','1'): 392 dprintf("ISO: File Type Major Brand: 3GPP Profile 1\n"); 393 break; 394 case MOV_FOURCC('3','g','p','2'): 395 case MOV_FOURCC('3','g','2','a'): 396 dprintf("ISO: File Type Major Brand: 3GPP Profile 2\n"); 397 break; 398 case MOV_FOURCC('3','g','p','3'): 399 dprintf("ISO: File Type Major Brand: 3GPP Profile 3\n"); 400 break; 401 case MOV_FOURCC('3','g','p','4'): 402 dprintf("ISO: File Type Major Brand: 3GPP Profile 4\n"); 403 break; 404 case MOV_FOURCC('3','g','p','5'): 405 dprintf("ISO: File Type Major Brand: 3GPP Profile 5\n"); 406 break; 407 case MOV_FOURCC('m','m','p','4'): 408 dprintf("ISO: File Type Major Brand: Mobile ISO/IEC 14496-1 (MPEG-4 system)\n"); 409 break; 410 default: 411 tmp = be2me_32(tmp); 412 dprintf("ISO: Unknown File Type Major Brand: %.4s\n",(char *)&tmp); 413 } 414 dprintf("ISO: File Type Minor Version: %d\n", 415 stream_read_dword(demuxer->stream)); 416 skipped += 8; 417 // List all compatible brands 418 for(i = 0; i < ((len-16)/4); i++) { 419 tmp = be2me_32(stream_read_dword(demuxer->stream)); 420 dprintf("ISO: File Type Compatible Brand #%d: %.4s\n",i,(char *)&tmp); 421 skipped += 4; 422 } 423 #endif 424 } break; 425 case MOV_FOURCC('m','o','o','v'): 426 // case MOV_FOURCC('c','m','o','v'): 427 dprintf("MOV: Movie header found!\n"); 428 priv->moov_start=(off_t)stream_tell(demuxer->stream); 429 priv->moov_end=(off_t)priv->moov_start+len-skipped; 430 dprintf("MOV: Movie header: start: %"PRIx64" end: %"PRIx64"\n", 431 (int64_t)priv->moov_start, (int64_t)priv->moov_end); 432 skipped+=8; 433 i = stream_read_dword(demuxer->stream)-8; 434 if(stream_read_dword(demuxer->stream)==MOV_FOURCC('r','m','r','a')){ 435 int ref=0; 436 skipped+=i; 437 dprintf("MOV: Reference Media file!!!\n"); 438 //set demuxer type to playlist ... 439 demuxer->type=DEMUXER_TYPE_PLAYLIST; 440 while(i>0){ 441 int len=stream_read_dword(demuxer->stream)-8; 442 int fcc=stream_read_dword(demuxer->stream); 443 if(len<0) break; // EOF!? 444 i-=8; 445 // printf("i=%d len=%d\n",i,len); 446 switch(fcc){ 447 case MOV_FOURCC('r','m','d','a'): 448 continue; 449 case MOV_FOURCC('r','d','r','f'): { 450 int tmp=stream_read_dword(demuxer->stream); 451 int type=stream_read_dword_le(demuxer->stream); 452 int slen=stream_read_dword(demuxer->stream); 453 //char* s=malloc(slen+1); 454 //stream_read(demuxer->stream,s,slen); 455 456 //FIXME: also store type & data_rate ? 457 ds_read_packet(demuxer->video, 458 demuxer->stream, 459 slen, 460 0, 461 stream_tell(demuxer->stream), 462 0 // no flags 463 ); 464 flags|=4; 465 dprintf("Added reference to playlist\n"); 466 //s[slen]=0; 467 //dprintf("REF: [%.4s] %s\n",&type,s); 468 len-=12+slen;i-=12+slen; break; 469 } 470 case MOV_FOURCC('r','m','d','r'): { 471 int flags=stream_read_dword(demuxer->stream); 472 int rate=stream_read_dword(demuxer->stream); 473 dprintf(" min. data rate: %d bits/sec\n",rate); 474 len-=8; i-=8; break; 475 } 476 case MOV_FOURCC('r','m','q','u'): { 477 int q=stream_read_dword(demuxer->stream); 478 dprintf(" quality index: %d\n",q); 479 len-=4; i-=4; break; 480 } 481 } 482 i-=len;stream_skip(demuxer->stream,len); 483 } 484 } 485 flags|=1; 486 break; 487 case MOV_FOURCC('w','i','d','e'): 488 dprintf("MOV: 'WIDE' chunk found!\n"); 489 if(flags&2) break; 490 case MOV_FOURCC('m','d','a','t'): 491 dprintf("MOV: Movie DATA found!\n"); 492 priv->mdat_start=stream_tell(demuxer->stream); 493 priv->mdat_end=priv->mdat_start+len-skipped; 494 dprintf("MOV: Movie data: start: %"PRIx64" end: %"PRIx64"\n", 495 (int64_t)priv->mdat_start, (int64_t)priv->mdat_end); 496 flags|=2; 497 if(flags==3){ 498 // if we're over the headers, then we can stop parsing here! 499 demuxer->priv=priv; 500 return DEMUXER_TYPE_MOV; 501 } 502 break; 503 case MOV_FOURCC('f','r','e','e'): 504 case MOV_FOURCC('s','k','i','p'): 505 case MOV_FOURCC('j','u','n','k'): 506 dprintf("MOV: free space (len: %"PRId64")\n", (int64_t)len); 507 /* unused, if you edit a mov, you can use space provided by free atoms (redefining it) */ 508 break; 509 case MOV_FOURCC('p','n','o','t'): 510 case MOV_FOURCC('P','I','C','T'): 511 /* dunno what, but we shoudl ignore it */ 512 break; 513 default: 514 if(no==0){ free(priv); return 0;} // first chunk is bad! 515 id = be2me_32(id); 516 dprintf("MOV: unknown chunk: %.4s %d\n",(char *)&id,(int)len); 517 } 518 skip_chunk: 519 if(!stream_skip(demuxer->stream,len-skipped)) break; 520 ++no; 521 } 522 523 if(flags==3){ 524 demuxer->priv=priv; 525 return DEMUXER_TYPE_MOV; 526 } 527 free(priv); 528 529 if ((flags==5) || (flags==7)) // reference & header sent 530 return DEMUXER_TYPE_PLAYLIST; 531 532 if(flags==1) 533 dprintf("MOV: missing data (mdat) chunk! Maybe broken file...\n"); 534 else if(flags==2) 535 dprintf("MOV: missing header (moov/cmov) chunk! Maybe broken file...\n"); 536 537 return 0; 214 538 } 215 539 216 // workaround for fixed-size video frames (dv and uncompressed) 217 if(!trak->samples_size && trak->type!=MOV_TRAK_AUDIO){ 218 trak->samples_size=s; 219 trak->samples=calloc(s, sizeof(mov_sample_t)); 220 for(i=0;i<s;i++) 221 trak->samples[i].size=trak->samplesize; 222 trak->samplesize=0; 540 static void demux_close_mov(demuxer_t *demuxer) { 541 mov_priv_t* priv = demuxer->priv; 542 int i; 543 if (!priv) 544 return; 545 for (i = 0; i < MOV_MAX_TRACKS; i++) { 546 mov_track_t *track = priv->tracks[i]; 547 if (track) { 548 free(track->tkdata); 549 free(track->stdata); 550 free(track->stream_header); 551 free(track->samples); 552 free(track->chunks); 553 free(track->chunkmap); 554 free(track->durmap); 555 free(track->keyframes); 556 free(track->editlist); 557 free(track->desc); 558 free(track); 559 } 560 } 561 free(priv); 223 562 } 224 563 225 if(!trak->samples_size){ 226 // constant sampesize 227 if(trak->durmap_size==1 || (trak->durmap_size==2 && trak->durmap[1].num==1)){ 228 trak->duration=trak->durmap[0].dur; 229 } else dprintf( "*** constant samplesize & variable duration not yet supported! ***\nContact the author if you have such sample file!\n"); 230 return; 564 unsigned int store_ughvlc(unsigned char *s, unsigned int v){ 565 unsigned int n = 0; 566 567 while(v >= 0xff) { 568 *s++ = 0xff; 569 v -= 0xff; 570 n++; 571 } 572 *s = v; 573 n++; 574 575 return n; 231 576 } 232 577 233 if (trak->samples_size < s) { 234 dprintf( 235 "MOV: durmap or chunkmap bigger than sample count (%i vs %i)\n", 236 s, trak->samples_size); 237 trak->samples_size = s; 238 trak->samples = realloc_struct(trak->samples, s, sizeof(mov_sample_t)); 578 static void init_vobsub(sh_sub_t *sh, mov_track_t *trak) { 579 int i; 580 uint8_t *pal = trak->stdata; 581 sh->type = 'v'; 582 if (trak->stdata_len < 106) 583 return; 584 sh->has_palette = 1; 585 pal += 42; 586 for (i = 0; i < 16; i++) { 587 sh->palette[i] = BE_32(pal); 588 pal += 4; 589 } 239 590 } 240 241 // calc pts: 242 s=0; 243 for(j=0;j<trak->durmap_size;j++){ 244 for(i=0;i<trak->durmap[j].num;i++){ 245 trak->samples[s].pts=pts; 246 ++s; 247 pts+=trak->durmap[j].dur; 248 } 249 } 250 251 // calc sample offsets 252 s=0; 253 for(j=0;j<trak->chunks_size;j++){ 254 off_t pos=trak->chunks[j].pos; 255 for(i=0;i<trak->chunks[j].size;i++){ 256 trak->samples[s].pos=pos; 257 dprintf( "Sample %5d: pts=%8d off=0x%08X size=%d\n",s, 258 trak->samples[s].pts, 259 (int)trak->samples[s].pos, 260 trak->samples[s].size); 261 pos+=trak->samples[s].size; 262 ++s; 263 } 264 } 265 266 // precalc editlist entries 267 if(trak->editlist_size>0){ 268 int frame=0; 269 int e_pts=0; 270 for(i=0;i<trak->editlist_size;i++){ 271 mov_editlist_t* el=&trak->editlist[i]; 272 int sample=0; 273 int pts=el->pos; 274 el->start_frame=frame; 275 if(pts<0){ 276 // skip! 277 el->frames=0; continue; 278 } 279 // find start sample 280 for(;sample<trak->samples_size;sample++){ 281 if(pts<=trak->samples[sample].pts) break; 282 } 283 el->start_sample=sample; 284 el->pts_offset=((long long)e_pts*(long long)trak->timescale)/(long long)timescale-trak->samples[sample].pts; 285 pts+=((long long)el->dur*(long long)trak->timescale)/(long long)timescale; 286 e_pts+=el->dur; 287 // find end sample 288 for(;sample<trak->samples_size;sample++){ 289 if(pts<trak->samples[sample].pts) break; 290 } 291 el->frames=sample-el->start_sample; 292 frame+=el->frames; 293 dprintf("EL#%d: pts=%d 1st_sample=%d frames=%d (%5.3fs) pts_offs=%d\n",i, 294 el->pos,el->start_sample, el->frames, 295 (float)(el->dur)/(float)timescale, el->pts_offset); 296 } 297 } 298 299 } 300 301 #define MOV_MAX_TRACKS 256 302 303 typedef struct { 304 off_t moov_start; 305 off_t moov_end; 306 off_t mdat_start; 307 off_t mdat_end; 308 int track_db; 309 mov_track_t* tracks[MOV_MAX_TRACKS]; 310 int timescale; // movie timescale 311 int duration; // movie duration (in movie timescale units) 312 } mov_priv_t; 313 314 #define MOV_FOURCC(a,b,c,d) ((a<<24)|(b<<16)|(c<<8)|(d)) 315 316 static int mov_check_file(demuxer_t* demuxer){ 317 int flags=0; 318 int no=0; 319 mov_priv_t* priv=malloc(sizeof(mov_priv_t)); 320 321 dprintf("Checking for MOV\n"); 322 323 memset(priv,0,sizeof(mov_priv_t)); 324 325 while(1){ 326 int i; 327 int skipped=8; 328 off_t len=stream_read_dword(demuxer->stream); 329 unsigned int id=stream_read_dword(demuxer->stream); 330 if(stream_eof(demuxer->stream)) break; // EOF 331 if (len == 1) /* real size is 64bits - cjb */ 332 { 333 #ifndef _LARGEFILE_SOURCE 334 if (stream_read_dword(demuxer->stream) != 0) 335 dprintf( "64bit file, but you've compiled MPlayer without LARGEFILE support!\n"); 336 len = stream_read_dword(demuxer->stream); 337 #else 338 len = stream_read_qword(demuxer->stream); 591 592 static int lschunks_intrak(demuxer_t* demuxer, int level, unsigned int id, 593 off_t pos, off_t len, mov_track_t* trak); 594 595 static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak){ 596 mov_priv_t* priv=demuxer->priv; 597 // printf("lschunks (level=%d,endpos=%x)\n", level, endpos); 598 while(1){ 599 off_t pos; 600 off_t len; 601 unsigned int id; 602 // 603 pos=stream_tell(demuxer->stream); 604 dprintf("MOV: stream_tell==%lli\n",pos); 605 if(pos>=endpos) return; // END 606 len=stream_read_dword(demuxer->stream); 607 // printf("len==%d\n",len); 608 if(len<8) return; // error 609 len-=8; 610 id=stream_read_dword(demuxer->stream); 611 // 612 dprintf("lschunks %.4s %d\n",(char *)&id,(int)len); 613 // 614 if(trak){ 615 if (lschunks_intrak(demuxer, level, id, pos, len, trak) < 0) 616 return; 617 } else { /* not in track */ 618 switch(id) { 619 case MOV_FOURCC('m','v','h','d'): { 620 int version = stream_read_char(demuxer->stream); 621 stream_skip(demuxer->stream, (version == 1) ? 19 : 11); 622 priv->timescale=stream_read_dword(demuxer->stream); 623 if (version == 1) 624 priv->duration=stream_read_qword(demuxer->stream); 625 else 626 priv->duration=stream_read_dword(demuxer->stream); 627 dprintf("MOV: %*sMovie header (%d bytes): tscale=%d dur=%d\n",level,"",(int)len, 628 (int)priv->timescale,(int)priv->duration); 629 break; 630 } 631 case MOV_FOURCC('t','r','a','k'): { 632 // if(trak) printf("MOV: Warning! trak in trak?\n"); 633 if(priv->track_db>=MOV_MAX_TRACKS){ 634 dprintf("MOV: too may tracks\n"); 635 return; 636 } 637 if(!priv->track_db) dprintf( "--------------\n"); 638 trak=malloc(sizeof(mov_track_t)); 639 memset(trak,0,sizeof(mov_track_t)); 640 dprintf("MOV: Track #%d:\n",priv->track_db); 641 trak->id=priv->track_db; 642 priv->tracks[priv->track_db]=trak; 643 lschunks(demuxer,level+1,pos+len,trak); 644 mov_build_index(trak,priv->timescale); 645 switch(trak->type){ 646 case MOV_TRAK_AUDIO: { 647 #if 0 648 struct { 649 int16_t version; // 0 or 1 (version 1 is qt3.0+) 650 int16_t revision; // 0 651 int32_t vendor_id; // 0 652 int16_t channels; // 1 or 2 (Mono/Stereo) 653 int16_t samplesize; // 8 or 16 (8Bit/16Bit) 654 int16_t compression_id; // if version 0 then 0 655 // if version 1 and vbr then -2 else 0 656 int16_t packet_size; // 0 657 uint16_t sample_rate; // samplerate (Hz) 658 // qt3.0+ (version == 1) 659 uint32_t samples_per_packet; // 0 or num uncompressed samples in a packet 660 // if 0 below three values are also 0 661 uint32_t bytes_per_packet; // 0 or num compressed bytes for one channel 662 uint32_t bytes_per_frame; // 0 or num compressed bytes for all channels 663 // (channels * bytes_per_packet) 664 uint32_t bytes_per_sample; // 0 or size of uncompressed sample 665 // if samples_per_packet and bytes_per_packet are constant (CBR) 666 // then bytes_per_frame and bytes_per_sample must be 0 (else is VBR) 667 // --- 668 // optional additional atom-based fields 669 // ([int32_t size,int32_t type,some data ],repeat) 670 } my_stdata; 339 671 #endif 340 skipped += 8; 341 } 342 #if 0 343 else if (len == 0) /* deleted chunk */ 344 { 345 /* XXX: CJB! is this right? - alex */ 346 goto skip_chunk; 347 } 348 #endif 349 else if(len<8) break; // invalid chunk 350 351 switch(id){ 352 case MOV_FOURCC('f','t','y','p'): { 353 unsigned int tmp; 354 // File Type Box (ftyp): 355 // char[4] major_brand (eg. 'isom') 356 // int minor_version (eg. 0x00000000) 357 // char[4] compatible_brands[] (eg. 'mp41') 358 // compatible_brands list spans to the end of box 359 #if 1 360 tmp = stream_read_dword(demuxer->stream); 361 switch(tmp) { 362 case MOV_FOURCC('i','s','o','m'): 363 dprintf("ISO: File Type Major Brand: ISO Base Media\n"); 364 break; 365 case MOV_FOURCC('m','p','4','1'): 366 dprintf("ISO: File Type Major Brand: ISO/IEC 14496-1 (MPEG-4 system) v1\n"); 367 break; 368 case MOV_FOURCC('m','p','4','2'): 369 dprintf("ISO: File Type Major Brand: ISO/IEC 14496-1 (MPEG-4 system) v2\n"); 370 break; 371 case MOV_FOURCC('M','4','A',' '): 372 dprintf("ISO: File Type Major Brand: Apple iTunes AAC-LC Audio\n"); 373 break; 374 case MOV_FOURCC('M','4','P',' '): 375 dprintf("ISO: File Type Major Brand: Apple iTunes AAC-LC Protected Audio\n"); 376 break; 377 case MOV_FOURCC('q','t',' ',' '): 378 dprintf("ISO: File Type Major Brand: Original QuickTime\n"); 379 break; 380 case MOV_FOURCC('3','g','p','1'): 381 dprintf("ISO: File Type Major Brand: 3GPP Profile 1\n"); 382 break; 383 case MOV_FOURCC('3','g','p','2'): 384 case MOV_FOURCC('3','g','2','a'): 385 dprintf("ISO: File Type Major Brand: 3GPP Profile 2\n"); 386 break; 387 case MOV_FOURCC('3','g','p','3'): 388 dprintf("ISO: File Type Major Brand: 3GPP Profile 3\n"); 389 break; 390 case MOV_FOURCC('3','g','p','4'): 391 dprintf("ISO: File Type Major Brand: 3GPP Profile 4\n"); 392 break; 393 case MOV_FOURCC('3','g','p','5'): 394 dprintf("ISO: File Type Major Brand: 3GPP Profile 5\n"); 395 break; 396 case MOV_FOURCC('m','m','p','4'): 397 dprintf("ISO: File Type Major Brand: Mobile ISO/IEC 14496-1 (MPEG-4 system)\n"); 398 break; 399 default: 400 tmp = be2me_32(tmp); 401 dprintf("ISO: Unknown File Type Major Brand: %.4s\n",(char *)&tmp); 402 } 403 dprintf("ISO: File Type Minor Version: %d\n", 404 stream_read_dword(demuxer->stream)); 405 skipped += 8; 406 // List all compatible brands 407 for(i = 0; i < ((len-16)/4); i++) { 408 tmp = be2me_32(stream_read_dword(demuxer->stream)); 409 dprintf("ISO: File Type Compatible Brand #%d: %.4s\n",i,(char *)&tmp); 410 skipped += 4; 411 } 412 #endif 413 } break; 414 case MOV_FOURCC('m','o','o','v'): 415 // case MOV_FOURCC('c','m','o','v'): 416 dprintf("MOV: Movie header found!\n"); 417 priv->moov_start=(off_t)stream_tell(demuxer->stream); 418 priv->moov_end=(off_t)priv->moov_start+len-skipped; 419 dprintf("MOV: Movie header: start: %"PRIx64" end: %"PRIx64"\n", 420 (int64_t)priv->moov_start, (int64_t)priv->moov_end); 421 skipped+=8; 422 i = stream_read_dword(demuxer->stream)-8; 423 if(stream_read_dword(demuxer->stream)==MOV_FOURCC('r','m','r','a')){ 424 int ref=0; 425 skipped+=i; 426 dprintf("MOV: Reference Media file!!!\n"); 427 //set demuxer type to playlist ... 428 demuxer->type=DEMUXER_TYPE_PLAYLIST; 429 while(i>0){ 430 int len=stream_read_dword(demuxer->stream)-8; 431 int fcc=stream_read_dword(demuxer->stream); 432 if(len<0) break; // EOF!? 433 i-=8; 434 // printf("i=%d len=%d\n",i,len); 435 switch(fcc){ 436 case MOV_FOURCC('r','m','d','a'): 437 continue; 438 case MOV_FOURCC('r','d','r','f'): { 439 int tmp=stream_read_dword(demuxer->stream); 440 int type=stream_read_dword_le(demuxer->stream); 441 int slen=stream_read_dword(demuxer->stream); 442 //char* s=malloc(slen+1); 443 //stream_read(demuxer->stream,s,slen); 444 445 //FIXME: also store type & data_rate ? 446 ds_read_packet(demuxer->video, 447 demuxer->stream, 448 slen, 449 0, 450 stream_tell(demuxer->stream), 451 0 // no flags 452 ); 453 flags|=4; 454 dprintf("Added reference to playlist\n"); 455 //s[slen]=0; 456 //dprintf("REF: [%.4s] %s\n",&type,s); 457 len-=12+slen;i-=12+slen; break; 458 } 459 case MOV_FOURCC('r','m','d','r'): { 460 int flags=stream_read_dword(demuxer->stream); 461 int rate=stream_read_dword(demuxer->stream); 462 dprintf(" min. data rate: %d bits/sec\n",rate); 463 len-=8; i-=8; break; 464 } 465 case MOV_FOURCC('r','m','q','u'): { 466 int q=stream_read_dword(demuxer->stream); 467 dprintf(" quality index: %d\n",q); 468 len-=4; i-=4; break; 469 } 470 } 471 i-=len;stream_skip(demuxer->stream,len); 472 } 473 } 474 flags|=1; 475 break; 476 case MOV_FOURCC('w','i','d','e'): 477 dprintf("MOV: 'WIDE' chunk found!\n"); 478 if(flags&2) break; 479 case MOV_FOURCC('m','d','a','t'): 480 dprintf("MOV: Movie DATA found!\n"); 481 priv->mdat_start=stream_tell(demuxer->stream); 482 priv->mdat_end=priv->mdat_start+len-skipped; 483 dprintf("MOV: Movie data: start: %"PRIx64" end: %"PRIx64"\n", 484 (int64_t)priv->mdat_start, (int64_t)priv->mdat_end); 485 flags|=2; 486 if(flags==3){ 487 // if we're over the headers, then we can stop parsing here! 488 demuxer->priv=priv; 489 return DEMUXER_TYPE_MOV; 490 } 491 break; 492 case MOV_FOURCC('f','r','e','e'): 493 case MOV_FOURCC('s','k','i','p'): 494 case MOV_FOURCC('j','u','n','k'): 495 dprintf("MOV: free space (len: %"PRId64")\n", (int64_t)len); 496 /* unused, if you edit a mov, you can use space provided by free atoms (redefining it) */ 497 break; 498 case MOV_FOURCC('p','n','o','t'): 499 case MOV_FOURCC('P','I','C','T'): 500 /* dunno what, but we shoudl ignore it */ 501 break; 502 default: 503 if(no==0){ free(priv); return 0;} // first chunk is bad! 504 id = be2me_32(id); 505 dprintf("MOV: unknown chunk: %.4s %d\n",(char *)&id,(int)len); 506 } 507 skip_chunk: 508 if(!stream_skip(demuxer->stream,len-skipped)) break; 509 ++no; 510 } 511 512 if(flags==3){ 513 demuxer->priv=priv; 514 return DEMUXER_TYPE_MOV; 515 } 516 free(priv); 517 518 if ((flags==5) || (flags==7)) // reference & header sent 519 return DEMUXER_TYPE_PLAYLIST; 520 521 if(flags==1) 522 dprintf("MOV: missing data (mdat) chunk! Maybe broken file...\n"); 523 else if(flags==2) 524 dprintf("MOV: missing header (moov/cmov) chunk! Maybe broken file...\n"); 525 526 return 0; 527 } 528 529 static void demux_close_mov(demuxer_t *demuxer) { 530 mov_priv_t* priv = demuxer->priv; 531 int i; 532 if (!priv) 533 return; 534 for (i = 0; i < MOV_MAX_TRACKS; i++) { 535 mov_track_t *track = priv->tracks[i]; 536 if (track) { 537 free(track->tkdata); 538 free(track->stdata); 539 free(track->stream_header); 540 free(track->samples); 541 free(track->chunks); 542 free(track->chunkmap); 543 free(track->durmap); 544 free(track->keyframes); 545 free(track->editlist); 546 free(track->desc); 547 free(track); 548 } 549 } 550 free(priv); 551 } 552 553 unsigned int store_ughvlc(unsigned char *s, unsigned int v){ 554 unsigned int n = 0; 555 556 while(v >= 0xff) { 557 *s++ = 0xff; 558 v -= 0xff; 559 n++; 560 } 561 *s = v; 562 n++; 563 564 return n; 565 } 566 567 static int lschunks_intrak(demuxer_t* demuxer, int level, unsigned int id, 568 off_t pos, off_t len, mov_track_t* trak); 569 570 static void lschunks(demuxer_t* demuxer,int level,off_t endpos,mov_track_t* trak){ 571 mov_priv_t* priv=demuxer->priv; 572 // printf("lschunks (level=%d,endpos=%x)\n", level, endpos); 573 while(1){ 574 off_t pos; 575 off_t len; 576 unsigned int id; 577 // 578 pos=stream_tell(demuxer->stream); 579 dprintf("MOV: stream_tell==%lli\n",pos); 580 if(pos>=endpos) return; // END 581 len=stream_read_dword(demuxer->stream); 582 // printf("len==%d\n",len); 583 if(len<8) return; // error 584 len-=8; 585 id=stream_read_dword(demuxer->stream); 586 // 587 dprintf("lschunks %.4s %d\n",(char *)&id,(int)len); 588 // 589 if(trak){ 590 if (lschunks_intrak(demuxer, level, id, pos, len, trak) < 0) 591 return; 592 } else { /* not in track */ 593 switch(id) { 594 case MOV_FOURCC('m','v','h','d'): { 595 int version = stream_read_char(demuxer->stream); 596 stream_skip(demuxer->stream, (version == 1) ? 19 : 11); 597 priv->timescale=stream_read_dword(demuxer->stream); 598 if (version == 1) 599 priv->duration=stream_read_qword(demuxer->stream); 600 else 601 priv->duration=stream_read_dword(demuxer->stream); 602 dprintf("MOV: %*sMovie header (%d bytes): tscale=%d dur=%d\n",level,"",(int)len, 603 (int)priv->timescale,(int)priv->duration); 604 break; 605 } 606 case MOV_FOURCC('t','r','a','k'): { 607 // if(trak) printf("MOV: Warning! trak in trak?\n"); 608 if(priv->track_db>=MOV_MAX_TRACKS){ 609 dprintf("MOV: too may tracks\n"); 610 return; 611 } 612 if(!priv->track_db) dprintf( "--------------\n"); 613 trak=malloc(sizeof(mov_track_t)); 614 memset(trak,0,sizeof(mov_track_t)); 615 dprintf("MOV: Track #%d:\n",priv->track_db); 616 trak->id=priv->track_db; 617 priv->tracks[priv->track_db]=trak; 618 lschunks(demuxer,level+1,pos+len,trak); 619 mov_build_index(trak,priv->timescale); 620 switch(trak->type){ 621 case MOV_TRAK_AUDIO: { 622 #if 0 623 struct { 624 int16_t version; // 0 or 1 (version 1 is qt3.0+) 625 int16_t revision; // 0 626 int32_t vendor_id; // 0 627 int16_t channels; // 1 or 2 (Mono/Stereo) 628 int16_t samplesize; // 8 or 16 (8Bit/16Bit) 629 int16_t compression_id; // if version 0 then 0 630 // if version 1 and vbr then -2 else 0 631 int16_t packet_size; // 0 632 uint16_t sample_rate; // samplerate (Hz) 633 // qt3.0+ (version == 1) 634 uint32_t samples_per_packet; // 0 or num uncompressed samples in a packet 635 // if 0 below three values are also 0 636 uint32_t bytes_per_packet; // 0 or num compressed bytes for one channel 637 uint32_t bytes_per_frame; // 0 or num compressed bytes for all channels 638 // (channels * bytes_per_packet) 639 uint32_t bytes_per_sample; // 0 or size of uncompressed sample 640 // if samples_per_packet and bytes_per_packet are constant (CBR) 641 // then bytes_per_frame and bytes_per_sample must be 0 (else is VBR) 642 // --- 643 // optional additional atom-based fields 644 // ([int32_t size,int32_t type,some data ],repeat) 645 } my_stdata; 646 #endif 647 int version, adjust; 648 int is_vorbis = 0; 649 sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db); 650 sh->format=trak->fourcc; 651 652 // crude audio delay from editlist0 hack ::atm 653 if(trak->editlist_size>=1) { 654 if(trak->editlist[0].pos == -1) { 655 sh->stream_delay = (float)trak->editlist[0].dur/(float)priv->timescale; 656 dprintf("MOV: Initial Audio-Delay: %.3f sec\n", sh->stream_delay); 672 int version, adjust; 673 int is_vorbis = 0; 674 sh_audio_t* sh=new_sh_audio(demuxer,priv->track_db); 675 sh->format=trak->fourcc; 676 677 // crude audio delay from editlist0 hack ::atm 678 if(trak->editlist_size>=1) { 679 if(trak->editlist[0].pos == -1) { 680 sh->stream_delay = (float)trak->editlist[0].dur/(float)priv->timescale; 681 dprintf("MOV: Initial Audio-Delay: %.3f sec\n", sh->stream_delay); 682 } 657 683 } 658 } 659 660 switch( sh->format ) { 661 case 0x726D6173: /* samr */ 662 /* amr narrowband */ 663 trak->samplebytes=sh->samplesize=1; 664 trak->nchannels=sh->channels=1; 665 sh->samplerate=8000; 666 break; 667 668 case 0x62776173: /* sawb */ 669 /* amr wideband */ 670 trak->samplebytes=sh->samplesize=1; 671 trak->nchannels=sh->channels=1; 672 sh->samplerate=16000; 673 break; 674 675 default: 676 677 // assumptions for below table: short is 16bit, int is 32bit, intfp is 16bit 678 // XXX: 32bit fixed point numbers (intfp) are only 2 Byte! 679 // short values are usually one byte leftpadded by zero 680 // int values are usually two byte leftpadded by zero 681 // stdata[]: 682 // 8 short version 683 // 10 short revision 684 // 12 int vendor_id 685 // 16 short channels 686 // 18 short samplesize 687 // 20 short compression_id 688 // 22 short packet_size (==0) 689 // 24 intfp sample_rate 690 // (26 short) unknown (==0) 691 // ---- qt3.0+ (version>=1) 692 // 28 int samples_per_packet 693 // 32 int bytes_per_packet 694 // 36 int bytes_per_frame 695 // 40 int bytes_per_sample 696 // there may be additional atoms following at 28 (version 0) 697 // or 44 (version 1), eg. esds atom of .MP4 files 698 // esds atom: 699 // 28 int atom size (bytes of int size, int type and data) 700 // 32 char[4] atom type (fourc charater code -> esds) 701 // 36 char[] atom data (len=size-8) 702 703 // TODO: fix parsing for files using version 2. 704 version=char2short(trak->stdata,8); 705 if (version > 1) 706 dprintf( "MOV: version %d sound atom may not parse correctly!\n", version); 707 trak->samplebytes=sh->samplesize=char2short(trak->stdata,18)/8; 708 709 /* I can't find documentation, but so far this is the case. -Corey */ 710 switch (char2short(trak->stdata,16)) { 711 case 1: 712 trak->nchannels = 1; break; 713 case 2: 714 trak->nchannels = 2; break; 715 case 3: 716 trak->nchannels = 6; break; 684 685 switch( sh->format ) { 686 case 0x726D6173: /* samr */ 687 /* amr narrowband */ 688 trak->samplebytes=sh->samplesize=1; 689 trak->nchannels=sh->channels=1; 690 sh->samplerate=8000; 691 break; 692 693 case 0x62776173: /* sawb */ 694 /* amr wideband */ 695 trak->samplebytes=sh->samplesize=1; 696 trak->nchannels=sh->channels=1; 697 sh->samplerate=16000; 698 break; 699 717 700 default: 718 dprintf( 719 "MOV: unable to determine audio channels, assuming 2 (got %d)\n", 720 char2short(trak->stdata,16)); 721 trak->nchannels = 2; 722 } 723 sh->channels = trak->nchannels; 724 725 /*printf("MOV: timescale: %d samplerate: %d durmap: %d (%d) -> %d (%d)\n", 726 trak->timescale, char2short(trak->stdata,24), trak->durmap[0].dur, 727 trak->durmap[0].num, trak->timescale/trak->durmap[0].dur, 728 char2short(trak->stdata,24)/trak->durmap[0].dur);*/ 729 sh->samplerate=char2short(trak->stdata,24); 730 if((sh->samplerate < 7000) && trak->durmap) { 731 switch(char2short(trak->stdata,24)/trak->durmap[0].dur) { 732 // TODO: add more cases. 733 case 31: 734 sh->samplerate = 32000; break; 735 case 43: 736 sh->samplerate = 44100; break; 737 case 47: 738 sh->samplerate = 48000; break; 701 702 // assumptions for below table: short is 16bit, int is 32bit, intfp is 16bit 703 // XXX: 32bit fixed point numbers (intfp) are only 2 Byte! 704 // short values are usually one byte leftpadded by zero 705 // int values are usually two byte leftpadded by zero 706 // stdata[]: 707 // 8 short version 708 // 10 short revision 709 // 12 int vendor_id 710 // 16 short channels 711 // 18 short samplesize 712 // 20 short compression_id 713 // 22 short packet_size (==0) 714 // 24 intfp sample_rate 715 // (26 short) unknown (==0) 716 // ---- qt3.0+ (version>=1) 717 // 28 int samples_per_packet 718 // 32 int bytes_per_packet 719 // 36 int bytes_per_frame 720 // 40 int bytes_per_sample 721 // there may be additional atoms following at 28 (version 0) 722 // or 44 (version 1), eg. esds atom of .MP4 files 723 // esds atom: 724 // 28 int atom size (bytes of int size, int type and data) 725 // 32 char[4] atom type (fourc charater code -> esds) 726 // 36 char[] atom data (len=size-8) 727 728 // TODO: fix parsing for files using version 2. 729 version=char2short(trak->stdata,8); 730 if (version > 1) 731 dprintf( "MOV: version %d sound atom may not parse correctly!\n", version); 732 trak->samplebytes=sh->samplesize=char2short(trak->stdata,18)/8; 733 734 /* I can't find documentation, but so far this is the case. -Corey */ 735 switch (char2short(trak->stdata,16)) { 736 case 1: 737 trak->nchannels = 1; break; 738 case 2: 739 trak->nchannels = 2; break; 740 case 3: 741 trak->nchannels = 6; break; 739 742 default: 740 743 dprintf( 741 "MOV: unable to determine audio samplerate, " 742 "assuming 44.1kHz (got %d)\n", 743 char2short(trak->stdata,24)/trak->durmap[0].dur); 744 sh->samplerate = 44100; 744 "MOV: unable to determine audio channels, assuming 2 (got %d)\n", 745 char2short(trak->stdata,16)); 746 trak->nchannels = 2; 747 } 748 sh->channels = trak->nchannels; 749 750 /*printf("MOV: timescale: %d samplerate: %d durmap: %d (%d) -> %d (%d)\n", 751 trak->timescale, char2short(trak->stdata,24), trak->durmap[0].dur, 752 trak->durmap[0].num, trak->timescale/trak->durmap[0].dur, 753 char2short(trak->stdata,24)/trak->durmap[0].dur);*/ 754 sh->samplerate=char2short(trak->stdata,24); 755 if((sh->samplerate < 7000) && trak->durmap) { 756 switch(char2short(trak->stdata,24)/trak->durmap[0].dur) { 757 // TODO: add more cases. 758 case 31: 759 sh->samplerate = 32000; break; 760 case 43: 761 sh->samplerate = 44100; break; 762 case 47: 763 sh->samplerate = 48000; break; 764 default: 765 dprintf( 766 "MOV: unable to determine audio samplerate, " 767 "assuming 44.1kHz (got %d)\n", 768 char2short(trak->stdata,24)/trak->durmap[0].dur); 769 sh->samplerate = 44100; 770 } 745 771 } 746 772 } 747 } 748 dprintf( "Audio bits: %d chans: %d rate: %d\n", 749 sh->samplesize*8,sh->channels,sh->samplerate); 750 751 if(trak->stdata_len >= 44 && trak->stdata[9]>=1){ 752 dprintf("Audio header: samp/pack=%d bytes/pack=%d bytes/frame=%d bytes/samp=%d \n", 753 char2int(trak->stdata,28), 754 char2int(trak->stdata,32), 755 char2int(trak->stdata,36), 756 char2int(trak->stdata,40)); 757 if(trak->stdata_len>=44+8){ 758 int len=char2int(trak->stdata,44); 759 int fcc=char2int(trak->stdata,48); 760 // we have extra audio headers!!! 761 dprintf("Audio extra header: len=%d fcc=0x%X\n",len,fcc); 762 if((len >= 4) && 763 (char2int(trak->stdata,52) >= 12) && 764 (char2int(trak->stdata,52+4) == MOV_FOURCC('f','r','m','a'))) { 765 switch(char2int(trak->stdata,52+8)) { 766 case MOV_FOURCC('a','l','a','c'): 767 if (len >= 36 + char2int(trak->stdata,52)) { 768 sh->codecdata_len = char2int(trak->stdata,52+char2int(trak->stdata,52)); 769 dprintf( "MOV: Found alac atom (%d)!\n", sh->codecdata_len); 770 sh->codecdata = (unsigned char *)malloc(sh->codecdata_len); 771 memcpy(sh->codecdata, &trak->stdata[52+char2int(trak->stdata,52)], sh->codecdata_len); 773 dprintf( "Audio bits: %d chans: %d rate: %d\n", 774 sh->samplesize*8,sh->channels,sh->samplerate); 775 776 if(trak->stdata_len >= 44 && trak->stdata[9]>=1){ 777 dprintf("Audio header: samp/pack=%d bytes/pack=%d bytes/frame=%d bytes/samp=%d \n", 778 char2int(trak->stdata,28), 779 char2int(trak->stdata,32), 780 char2int(trak->stdata,36), 781 char2int(trak->stdata,40)); 782 if(trak->stdata_len>=44+8){ 783 int len=char2int(trak->stdata,44); 784 int fcc=char2int(trak->stdata,48); 785 // we have extra audio headers!!! 786 dprintf("Audio extra header: len=%d fcc=0x%X\n",len,fcc); 787 if((len >= 4) && 788 (char2int(trak->stdata,52) >= 12) && 789 (char2int(trak->stdata,52+4) == MOV_FOURCC('f','r','m','a'))) { 790 switch(char2int(trak->stdata,52+8)) { 791 case MOV_FOURCC('a','l','a','c'): 792 if (len >= 36 + char2int(trak->stdata,52)) { 793 sh->codecdata_len = char2int(trak->stdata,52+char2int(trak->stdata,52)); 794 dprintf( "MOV: Found alac atom (%d)!\n", sh->codecdata_len); 795 sh->codecdata = (unsigned char *)malloc(sh->codecdata_len); 796 memcpy(sh->codecdata, &trak->stdata[52+char2int(trak->stdata,52)], sh->codecdata_len); 797 } 798 break; 799 case MOV_FOURCC('i','n','2','4'): 800 case MOV_FOURCC('i','n','3','2'): 801 case MOV_FOURCC('f','l','3','2'): 802 case MOV_FOURCC('f','l','6','4'): 803 if ((len >= 22) && 804 (char2int(trak->stdata,52+16)==MOV_FOURCC('e','n','d','a')) && 805 (char2short(trak->stdata,52+20))) { 806 sh->format=char2int(trak->stdata,52+8); 807 dprintf( "MOV: Found little endian PCM data, reversed fourcc:%04x\n", sh->format); 808 } 809 break; 810 default: 811 if (len > 8 && len + 44 <= trak->stdata_len) { 812 sh->codecdata_len = len-8; 813 sh->codecdata = trak->stdata+44+8; 814 } 772 815 } 773 break; 774 case MOV_FOURCC('i','n','2','4'): 775 case MOV_FOURCC('i','n','3','2'): 776 case MOV_FOURCC('f','l','3','2'): 777 case MOV_FOURCC('f','l','6','4'): 778 if ((len >= 22) && 779 (char2int(trak->stdata,52+16)==MOV_FOURCC('e','n','d','a')) && 780 (char2short(trak->stdata,52+20))) { 781 sh->format=char2int(trak->stdata,52+8); 782 dprintf( "MOV: Found little endian PCM data, reversed fourcc:%04x\n", sh->format); 783 } 784 break; 785 default: 816 } else { 786 817 if (len > 8 && len + 44 <= trak->stdata_len) { 787 818 sh->codecdata_len = len-8; … … 789 820 } 790 821 } 791 } else { 792 if (len > 8 && len + 44 <= trak->stdata_len) { 793 sh->codecdata_len = len-8; 794 sh->codecdata = trak->stdata+44+8; 822 } 823 } 824 825 switch (version) { 826 case 0: 827 adjust = 0; break; 828 case 1: 829 adjust = 48; break; 830 case 2: 831 adjust = 68; break; 832 default: 833 dprintf( "MOV: unknown sound atom version (%d); may not work!\n", version); 834 adjust = 68; 835 } 836 if (trak->stdata_len >= 36 + adjust) { 837 int atom_len = char2int(trak->stdata,28+adjust); 838 switch(char2int(trak->stdata,32+adjust)) { // atom type 839 case MOV_FOURCC('e','s','d','s'): { 840 dprintf( "MOV: Found MPEG4 audio Elementary Stream Descriptor atom (%d)!\n", atom_len); 841 if(atom_len > 8) { 842 esds_t esds; 843 if(!mp4_parse_esds(&trak->stdata[36+adjust], atom_len-8, &esds)) { 844 /* 0xdd is a "user private" id, not an official allocated id (see http://www.mp4ra.org/object.html), 845 so perform some extra checks to be sure that this is really vorbis audio */ 846 if(esds.objectTypeId==0xdd && esds.streamType==0x15 && sh->format==0x6134706D && esds.decoderConfigLen > 8) 847 { 848 //vorbis audio 849 unsigned char *buf[3]; 850 unsigned short sizes[3]; 851 int offset, len, k; 852 unsigned char *ptr = esds.decoderConfig; 853 854 if(ptr[0] != 0 || ptr[1] != 30) goto quit_vorbis_block; //wrong extradata layout 855 856 offset = len = 0; 857 for(k = 0; k < 3; k++) 858 { 859 sizes[k] = (ptr[offset]<<8) | ptr[offset+1]; 860 len += sizes[k]; 861 offset += 2; 862 if(offset + sizes[k] > esds.decoderConfigLen) 863 { 864 dprintf("MOV: ERROR!, not enough vorbis extradata to read: offset = %d, k=%d, size=%d, len: %d\n", offset, k, sizes[k], esds.decoderConfigLen); 865 goto quit_vorbis_block; 866 } 867 buf[k] = malloc(sizes[k]); 868 if(!buf[k]) goto quit_vorbis_block; 869 memcpy(buf[k], &ptr[offset], sizes[k]); 870 offset += sizes[k]; 871 } 872 873 sh->codecdata_len = len + len/255 + 64; 874 sh->codecdata = malloc(sh->codecdata_len); 875 ptr = sh->codecdata; 876 877 ptr[0] = 2; 878 offset = 1; 879 offset += store_ughvlc(&ptr[offset], sizes[0]); 880 offset += store_ughvlc(&ptr[offset], sizes[1]); 881 for(k = 0; k < 3; k++) 882 { 883 memcpy(&ptr[offset], buf[k], sizes[k]); 884 offset += sizes[k]; 885 } 886 887 sh->codecdata_len = offset; 888 sh->codecdata = realloc(sh->codecdata, offset); 889 dprintf("demux_mov, vorbis extradata size: %d\n", offset); 890 is_vorbis = 1; 891 quit_vorbis_block: 892 sh->format = mmioFOURCC('v', 'r', 'b', 's'); 893 } 894 sh->i_bps = esds.avgBitrate/8; 895 896 // printf("######## audio format = %d ########\n",esds.objectTypeId); 897 if(esds.objectTypeId==MP4OTI_MPEG1Audio || esds.objectTypeId==MP4OTI_MPEG2AudioPart3) 898 sh->format=0x55; // .mp3 899 if(esds.objectTypeId==MP4OTI_13kVoice) { // 13K Voice, defined by 3GPP2 900 sh->format=mmioFOURCC('Q', 'c', 'l', 'p'); 901 trak->nchannels=sh->channels=1; 902 trak->samplebytes=sh->samplesize=1; 903 } 904 905 // dump away the codec specific configuration for the AAC decoder 906 if(esds.decoderConfigLen){ 907 if( (esds.decoderConfig[0]>>3) == 29 ) 908 sh->format = 0x1d61346d; // request multi-channel mp3 decoder 909 if(!is_vorbis) 910 { 911 sh->codecdata_len = esds.decoderConfigLen; 912 sh->codecdata = (unsigned char *)malloc(sh->codecdata_len); 913 memcpy(sh->codecdata, esds.decoderConfig, sh->codecdata_len); 914 } 915 } 916 } 917 mp4_free_esds(&esds); // freeup esds mem 918 #if 0 919 { FILE* f=fopen("esds.dat","wb"); 920 fwrite(&trak->stdata[36],atom_len-8,1,f); 921 fclose(f); } 922 #endif 923 } 924 } break; 925 case MOV_FOURCC('a','l','a','c'): { 926 dprintf( "MOV: Found alac atom (%d)!\n", atom_len); 927 if(atom_len > 8) { 928 // copy all the atom (not only payload) for lavc alac decoder 929 sh->codecdata_len = atom_len; 930 sh->codecdata = (unsigned char *)malloc(sh->codecdata_len); 931 memcpy(sh->codecdata, &trak->stdata[28], sh->codecdata_len); 932 } 933 } break; 934 case MOV_FOURCC('d','a','m','r'): 935 dprintf( "MOV: Found AMR audio atom %c%c%c%c (%d)!\n", trak->stdata[32+adjust],trak->stdata[33+adjust],trak->stdata[34+adjust],trak->stdata[35+adjust], atom_len); 936 if (atom_len>14) { 937 dprintf( "mov: vendor: %c%c%c%c Version: %d\n",trak->stdata[36+adjust],trak->stdata[37+adjust],trak->stdata[38+adjust], trak->stdata[39+adjust],trak->stdata[40+adjust]); 938 dprintf( "MOV: Modes set: %02x%02x\n",trak->stdata[41+adjust],trak->stdata[42+adjust]); 939 dprintf( "MOV: Mode change period: %d Frames per sample: %d\n",trak->stdata[43+adjust],trak->stdata[44+adjust]); 940 } 941 break; 942 default: 943 dprintf( "MOV: Found unknown audio atom %c%c%c%c (%d)!\n", 944 trak->stdata[32+adjust],trak->stdata[33+adjust],trak->stdata[34+adjust],trak->stdata[35+adjust], 945 atom_len); 946 } 947 } 948 dprintf( "Fourcc: %.4s\n",(char *)&trak->fourcc); 949 #if 0 950 { FILE* f=fopen("stdata.dat","wb"); 951 fwrite(trak->stdata,trak->stdata_len,1,f); 952 fclose(f); } 953 { FILE* f=fopen("tkdata.dat","wb"); 954 fwrite(trak->tkdata,trak->tkdata_len,1,f); 955 fclose(f); } 956 #endif 957 // Emulate WAVEFORMATEX struct: 958 sh->wf=malloc(sizeof(WAVEFORMATEX) + (is_vorbis ? sh->codecdata_len : 0)); 959 memset(sh->wf,0,sizeof(WAVEFORMATEX)); 960 sh->wf->nChannels=sh->channels; 961 sh->wf->wBitsPerSample=(trak->stdata[18]<<8)+trak->stdata[19]; 962 // sh->wf->nSamplesPerSec=trak->timescale; 963 sh->wf->nSamplesPerSec=sh->samplerate; 964 if(trak->stdata_len >= 44 && trak->stdata[9]>=1 && char2int(trak->stdata,28)>0){ 965 //Audio header: samp/pack=4096 bytes/pack=743 bytes/frame=1486 bytes/samp=2 966 sh->wf->nAvgBytesPerSec=(sh->wf->nChannels*sh->wf->nSamplesPerSec* 967 char2int(trak->stdata,32)+char2int(trak->stdata,28)/2) 968 /char2int(trak->stdata,28); 969 sh->wf->nBlockAlign=char2int(trak->stdata,36); 970 } else { 971 sh->wf->nAvgBytesPerSec=sh->wf->nChannels*sh->wf->wBitsPerSample*sh->wf->nSamplesPerSec/8; 972 // workaround for ms11 ima4 973 if (sh->format == 0x1100736d && trak->stdata_len >= 36) 974 sh->wf->nBlockAlign=char2int(trak->stdata,36); 975 } 976 if(is_vorbis && sh->codecdata_len) 977 { 978 memcpy(sh->wf+1, sh->codecdata, sh->codecdata_len); 979 sh->wf->cbSize = sh->codecdata_len; 980 } 981 // Selection: 982 // if(demuxer->audio->id==-1 || demuxer->audio->id==priv->track_db){ 983 // // (auto)selected audio track: 984 // demuxer->audio->id=priv->track_db; 985 // demuxer->audio->sh=sh; sh->ds=demuxer->audio; 986 // } 987 break; 988 } 989 case MOV_TRAK_VIDEO: { 990 int i, entry; 991 int flag, start, count_flag, end, palette_count, gray; 992 int hdr_ptr = 76; // the byte just after depth 993 unsigned char *palette_map; 994 sh_video_t* sh=new_sh_video(demuxer,priv->track_db); 995 int depth; 996 sh->format=trak->fourcc; 997 998 // crude video delay from editlist0 hack ::atm 999 if(trak->editlist_size>=1) { 1000 if(trak->editlist[0].pos == -1) { 1001 sh->stream_delay = (float)trak->editlist[0].dur/(float)priv->timescale; 1002 dprintf("MOV: Initial Video-Delay: %.3f sec\n", sh->stream_delay); 1003 } 1004 } 1005 1006 if (trak->stdata_len < 78) { 1007 dprintf("MOV: Invalid (%d bytes instead of >= 78) video trak desc\n", 1008 trak->stdata_len); 1009 break; 1010 } 1011 depth = trak->stdata[75] | (trak->stdata[74] << 8); 1012 // stdata[]: 1013 // 8 short version 1014 // 10 short revision 1015 // 12 int vendor_id 1016 // 16 int temporal_quality 1017 // 20 int spatial_quality 1018 // 24 short width 1019 // 26 short height 1020 // 28 int h_dpi 1021 // 32 int v_dpi 1022 // 36 int 0 1023 // 40 short frames_per_sample 1024 // 42 char[4] compressor_name 1025 // 74 short depth 1026 // 76 short color_table_id 1027 // additional atoms may follow, 1028 // eg esds atom from .MP4 files 1029 // 78 int atom size 1030 // 82 char[4] atom type 1031 // 86 ... atom data 1032 1033 { ImageDescription* id=malloc(8+trak->stdata_len); // safe 1034 trak->desc=id; 1035 id->idSize=8+trak->stdata_len; 1036 // id->cType=bswap_32(trak->fourcc); 1037 id->cType=le2me_32(trak->fourcc); 1038 id->version=char2short(trak->stdata,8); 1039 id->revisionLevel=char2short(trak->stdata,10); 1040 id->vendor=char2int(trak->stdata,12); 1041 id->temporalQuality=char2int(trak->stdata,16); 1042 id->spatialQuality=char2int(trak->stdata,20); 1043 id->width=char2short(trak->stdata,24); 1044 id->height=char2short(trak->stdata,26); 1045 id->hRes=char2int(trak->stdata,28); 1046 id->vRes=char2int(trak->stdata,32); 1047 id->dataSize=char2int(trak->stdata,36); 1048 id->frameCount=char2short(trak->stdata,40); 1049 memcpy(&id->name,trak->stdata+42,32); 1050 id->depth=char2short(trak->stdata,74); 1051 id->clutID=char2short(trak->stdata,76); 1052 if(trak->stdata_len>78) memcpy(((char*)&id->clutID)+2,trak->stdata+78,trak->stdata_len-78); 1053 sh->ImageDesc=id; 1054 #if 0 1055 { FILE *f=fopen("ImageDescription","wb"); 1056 fwrite(id,id->idSize,1,f); 1057 fclose(f); 1058 } 1059 #endif 1060 } 1061 1062 if(trak->stdata_len >= 86) { // extra atoms found 1063 int pos=78; 1064 int atom_len; 1065 while(pos+8<=trak->stdata_len && 1066 (pos+(atom_len=char2int(trak->stdata,pos)))<=trak->stdata_len){ 1067 switch(char2int(trak->stdata,pos+4)) { // switch atom type 1068 case MOV_FOURCC('g','a','m','a'): 1069 // intfp with gamma value at which movie was captured 1070 // can be used to gamma correct movie display 1071 dprintf( "MOV: Found unsupported Gamma-Correction movie atom (%d)!\n", 1072 atom_len); 1073 break; 1074 case MOV_FOURCC('f','i','e','l'): 1075 // 2 char-values (8bit int) that specify field handling 1076 // see the Apple's QuickTime Fileformat PDF for more info 1077 dprintf( "MOV: Found unsupported Field-Handling movie atom (%d)!\n", 1078 atom_len); 1079 break; 1080 case MOV_FOURCC('m','j','q','t'): 1081 // Motion-JPEG default quantization table 1082 dprintf( "MOV: Found unsupported MJPEG-Quantization movie atom (%d)!\n", 1083 atom_len); 1084 break; 1085 case MOV_FOURCC('m','j','h','t'): 1086 // Motion-JPEG default huffman table 1087 dprintf( "MOV: Found unsupported MJPEG-Huffman movie atom (%d)!\n", 1088 atom_len); 1089 break; 1090 case MOV_FOURCC('e','s','d','s'): 1091 // MPEG4 Elementary Stream Descriptor header 1092 dprintf( "MOV: Found MPEG4 movie Elementary Stream Descriptor atom (%d)!\n", atom_len); 1093 // add code here to save esds header of length atom_len-8 1094 // beginning at stdata[86] to some variable to pass it 1095 // on to the decoder ::atmos 1096 if(atom_len > 8) { 1097 esds_t esds; 1098 if(!mp4_parse_esds(trak->stdata+pos+8, atom_len-8, &esds)) { 1099 1100 if(esds.objectTypeId==MP4OTI_MPEG2VisualSimple || esds.objectTypeId==MP4OTI_MPEG2VisualMain || 1101 esds.objectTypeId==MP4OTI_MPEG2VisualSNR || esds.objectTypeId==MP4OTI_MPEG2VisualSpatial || 1102 esds.objectTypeId==MP4OTI_MPEG2VisualHigh || esds.objectTypeId==MP4OTI_MPEG2Visual422) 1103 sh->format=mmioFOURCC('m', 'p', 'g', '2'); 1104 else if(esds.objectTypeId==MP4OTI_MPEG1Visual) 1105 sh->format=mmioFOURCC('m', 'p', 'g', '1'); 1106 1107 // dump away the codec specific configuration for the AAC decoder 1108 trak->stream_header_len = esds.decoderConfigLen; 1109 trak->stream_header = (unsigned char *)malloc(trak->stream_header_len); 1110 memcpy(trak->stream_header, esds.decoderConfig, trak->stream_header_len); 1111 } 1112 mp4_free_esds(&esds); // freeup esds mem 1113 } 1114 break; 1115 case MOV_FOURCC('a','v','c','C'): 1116 // AVC decoder configuration record 1117 dprintf( "MOV: AVC decoder configuration record atom (%d)!\n", atom_len); 1118 if(atom_len > 8) { 1119 int i, poffs, cnt; 1120 // Parse some parts of avcC, just for fun :) 1121 // real parsing is done by avc1 decoder 1122 dprintf( "MOV: avcC version: %d\n", *(trak->stdata+pos+8)); 1123 if (*(trak->stdata+pos+8) != 1) 1124 dprintf( "MOV: unknown avcC version (%d). Expexct problems.\n", *(trak->stdata+pos+9)); 1125 dprintf( "MOV: avcC profile: %d\n", *(trak->stdata+pos+9)); 1126 dprintf( "MOV: avcC profile compatibility: %d\n", *(trak->stdata+pos+10)); 1127 dprintf( "MOV: avcC level: %d\n", *(trak->stdata+pos+11)); 1128 dprintf( "MOV: avcC nal length size: %d\n", ((*(trak->stdata+pos+12))&0x03)+1); 1129 dprintf( "MOV: avcC number of sequence param sets: %d\n", cnt = (*(trak->stdata+pos+13) & 0x1f)); 1130 poffs = pos + 14; 1131 for (i = 0; i < cnt; i++) { 1132 dprintf( "MOV: avcC sps %d have length %d\n", i, BE_16(trak->stdata+poffs)); 1133 poffs += BE_16(trak->stdata+poffs) + 2; 1134 } 1135 dprintf( "MOV: avcC number of picture param sets: %d\n", *(trak->stdata+poffs)); 1136 poffs++; 1137 for (i = 0; i < cnt; i++) { 1138 dprintf( "MOV: avcC pps %d have length %d\n", i, BE_16(trak->stdata+poffs)); 1139 poffs += BE_16(trak->stdata+poffs) + 2; 1140 } 1141 // Copy avcC for the AVC decoder 1142 // This data will be put in extradata below, where BITMAPINFOHEADER is created 1143 trak->stream_header_len = atom_len-8; 1144 trak->stream_header = (unsigned char *)malloc(trak->stream_header_len); 1145 memcpy(trak->stream_header, trak->stdata+pos+8, trak->stream_header_len); 1146 } 1147 break; 1148 case MOV_FOURCC('d','2','6','3'): 1149 dprintf( "MOV: Found H.263 decoder atom %c%c%c%c (%d)!\n", trak->stdata[pos+4],trak->stdata[pos+5],trak->stdata[pos+6],trak->stdata[pos+7],atom_len); 1150 if (atom_len>10) 1151 dprintf( "MOV: Vendor: %c%c%c%c H.263 level: %d H.263 profile: %d \n", trak->stdata[pos+8],trak->stdata[pos+9],trak->stdata[pos+10],trak->stdata[pos+11],trak->stdata[pos+12],trak->stdata[pos+13]); 1152 break; 1153 case 0: 1154 break; 1155 default: 1156 dprintf( "MOV: Found unknown movie atom %c%c%c%c (%d)!\n", 1157 trak->stdata[pos+4],trak->stdata[pos+5],trak->stdata[pos+6],trak->stdata[pos+7], 1158 atom_len); 1159 } 1160 if(atom_len<8) break; 1161 pos+=atom_len; 1162 // printf("pos=%d max=%d\n",pos,trak->stdata_len); 1163 } 1164 } 1165 sh->fps=trak->timescale/ 1166 ((trak->durmap_size>=1)?(float)trak->durmap[0].dur:1); 1167 sh->frametime=1.0f/sh->fps; 1168 1169 sh->disp_w=trak->stdata[25]|(trak->stdata[24]<<8); 1170 sh->disp_h=trak->stdata[27]|(trak->stdata[26]<<8); 1171 // if image size is zero, fallback to display size 1172 if(!sh->disp_w && !sh->disp_h) { 1173 sh->disp_w=trak->tkdata[77]|(trak->tkdata[76]<<8); 1174 sh->disp_h=trak->tkdata[81]|(trak->tkdata[80]<<8); 1175 } else if(sh->disp_w!=(trak->tkdata[77]|(trak->tkdata[76]<<8))){ 1176 // codec and display width differ... use display one for aspect 1177 sh->aspect=trak->tkdata[77]|(trak->tkdata[76]<<8); 1178 sh->aspect/=trak->tkdata[81]|(trak->tkdata[80]<<8); 1179 } 1180 1181 if(depth>32+8) printf("*** depth = 0x%X\n",depth); 1182 1183 // palettized? 1184 gray = 0; 1185 if (depth > 32) { depth&=31; gray = 1; } // depth > 32 means grayscale 1186 if ((depth == 2) || (depth == 4) || (depth == 8)) 1187 palette_count = (1 << depth); 1188 else 1189 palette_count = 0; 1190 1191 // emulate BITMAPINFOHEADER: 1192 if (palette_count) 1193 { 1194 sh->bih=malloc(sizeof(BITMAPINFOHEADERw) + palette_count * 4); 1195 memset(sh->bih,0,sizeof(BITMAPINFOHEADERw) + palette_count * 4); 1196 sh->bih->biSize=40 + palette_count * 4; 1197 // fetch the relevant fields 1198 flag = BE_16(&trak->stdata[hdr_ptr]); 1199 hdr_ptr += 2; 1200 start = BE_32(&trak->stdata[hdr_ptr]); 1201 hdr_ptr += 4; 1202 count_flag = BE_16(&trak->stdata[hdr_ptr]); 1203 hdr_ptr += 2; 1204 end = BE_16(&trak->stdata[hdr_ptr]); 1205 hdr_ptr += 2; 1206 palette_map = (unsigned char *)sh->bih + 40; 1207 dprintf( "Allocated %d entries for palette\n", 1208 palette_count); 1209 dprintf( "QT palette: start: %x, end: %x, count flag: %d, flags: %x\n", 1210 start, end, count_flag, flag); 1211 1212 /* XXX: problems with sample (statunit6.mov) with flag&0x4 set! - alex*/ 1213 1214 // load default palette 1215 if (flag & 0x08) 1216 { 1217 if (gray) 1218 { 1219 dprintf( "Using default QT grayscale palette\n"); 1220 if (palette_count == 16) 1221 memcpy(palette_map, qt_default_grayscale_palette_16, 16 * 4); 1222 else if (palette_count == 256) { 1223 memcpy(palette_map, qt_default_grayscale_palette_256, 256 * 4); 1224 if (trak->fourcc == mmioFOURCC('c','v','i','d')) { 1225 int i; 1226 // Hack for grayscale CVID, negative palette 1227 // If you have samples where this is not required contact me (rxt) 1228 dprintf( "MOV: greyscale cvid with default palette," 1229 " enabling negative palette hack.\n"); 1230 for (i = 0; i < 256 * 4; i++) 1231 palette_map[i] = palette_map[i] ^ 0xff; 1232 } 1233 } 1234 } 1235 else 1236 { 1237 dprintf( "Using default QT colour palette\n"); 1238 if (palette_count == 4) 1239 memcpy(palette_map, qt_default_palette_4, 4 * 4); 1240 else if (palette_count == 16) 1241 memcpy(palette_map, qt_default_palette_16, 16 * 4); 1242 else if (palette_count == 256) 1243 memcpy(palette_map, qt_default_palette_256, 256 * 4); 1244 } 1245 } 1246 // load palette from file 1247 else 1248 { 1249 dprintf( "Loading palette from file\n"); 1250 for (i = start; i <= end; i++) 1251 { 1252 entry = BE_16(&trak->stdata[hdr_ptr]); 1253 hdr_ptr += 2; 1254 // apparently, if count_flag is set, entry is same as i 1255 if (count_flag & 0x8000) 1256 entry = i; 1257 // only care about top 8 bits of 16-bit R, G, or B value 1258 if (entry <= palette_count && entry >= 0) 1259 { 1260 palette_map[entry * 4 + 2] = trak->stdata[hdr_ptr + 0]; 1261 palette_map[entry * 4 + 1] = trak->stdata[hdr_ptr + 2]; 1262 palette_map[entry * 4 + 0] = trak->stdata[hdr_ptr + 4]; 1263 dprintf("QT palette: added entry: %d of %d (colors: R:%x G:%x B:%x)\n", 1264 entry, palette_count, 1265 palette_map[entry * 4 + 2], 1266 palette_map[entry * 4 + 1], 1267 palette_map[entry * 4 + 0]); 1268 } 1269 else 1270 dprintf( "QT palette: skipped entry (out of count): %d of %d\n", 1271 entry, palette_count); 1272 hdr_ptr += 6; 795 1273 } 796 1274 } 797 1275 } 1276 else 1277 { 1278 if (trak->fourcc == mmioFOURCC('a','v','c','1')) { 1279 if (trak->stream_header_len > 0xffffffff - sizeof(BITMAPINFOHEADERw)) { 1280 dprintf("Invalid extradata size %d, skipping\n"); 1281 trak->stream_header_len = 0; 1282 } 1283 1284 sh->bih=malloc(sizeof(BITMAPINFOHEADERw) + trak->stream_header_len); 1285 memset(sh->bih,0,sizeof(BITMAPINFOHEADERw) + trak->stream_header_len); 1286 sh->bih->biSize=40 + trak->stream_header_len; 1287 memcpy(((unsigned char *)sh->bih)+40, trak->stream_header, trak->stream_header_len); 1288 free (trak->stream_header); 1289 trak->stream_header_len = 0; 1290 trak->stream_header = NULL; 1291 } else { 1292 sh->bih=malloc(sizeof(BITMAPINFOHEADERw)); 1293 memset(sh->bih,0,sizeof(BITMAPINFOHEADERw)); 1294 sh->bih->biSize=40; 1295 } 1296 } 1297 sh->bih->biWidth=sh->disp_w; 1298 sh->bih->biHeight=sh->disp_h; 1299 sh->bih->biPlanes=0; 1300 sh->bih->biBitCount=depth; 1301 sh->bih->biCompression=trak->fourcc; 1302 sh->bih->biSizeImage=sh->bih->biWidth*sh->bih->biHeight; 1303 1304 dprintf( "Image size: %d x %d (%d bpp)\n",sh->disp_w,sh->disp_h,sh->bih->biBitCount); 1305 if(trak->tkdata_len>81) 1306 dprintf( "Display size: %d x %d\n", 1307 trak->tkdata[77]|(trak->tkdata[76]<<8), 1308 trak->tkdata[81]|(trak->tkdata[80]<<8)); 1309 dprintf( "Fourcc: %.4s Codec: '%.*s'\n",(char *)&trak->fourcc,trak->stdata[42]&31,trak->stdata+43); 1310 1311 // if(demuxer->video->id==-1 || demuxer->video->id==priv->track_db){ 1312 // // (auto)selected video track: 1313 // demuxer->video->id=priv->track_db; 1314 // demuxer->video->sh=sh; sh->ds=demuxer->video; 1315 // } 1316 break; 798 1317 } 799 800 switch (version) { 801 case 0: 802 adjust = 0; break; 803 case 1: 804 adjust = 48; break; 805 case 2: 806 adjust = 68; break; 1318 case MOV_TRAK_GENERIC: 1319 if (trak->fourcc == mmioFOURCC('m','p','4','s') || 1320 trak->fourcc == mmioFOURCC('t','x','3','g') || 1321 trak->fourcc == mmioFOURCC('t','e','x','t')) { 1322 sh_sub_t *sh = new_sh_sub(demuxer, priv->track_db); 1323 if (trak->fourcc == mmioFOURCC('m','p','4','s')) 1324 init_vobsub(sh, trak); 1325 else 1326 sh->type = 't'; 1327 } else 1328 dprintf("Generic track - not completely understood! (id: %d)\n", 1329 trak->id); 1330 /* XXX: Also this contains the FLASH data */ 1331 #if 0 1332 { 1333 int pos = stream_tell(demuxer->stream); 1334 int i; 1335 int fd; 1336 char name[20]; 1337 1338 for (i=0; i<trak->samples_size; i++) 1339 { 1340 char buf[trak->samples[i].size]; 1341 stream_seek(demuxer->stream, trak->samples[i].pos); 1342 snprintf((char *)&name[0], 20, "samp%d", i); 1343 fd = open((char *)&name[0], O_CREAT|O_WRONLY); 1344 stream_read(demuxer->stream, &buf[0], trak->samples[i].size); 1345 write(fd, &buf[0], trak->samples[i].size); 1346 close(fd); 1347 } 1348 for (i=0; i<trak->chunks_size; i++) 1349 { 1350 char buf[trak->length]; 1351 stream_seek(demuxer->stream, trak->chunks[i].pos); 1352 snprintf((char *)&name[0], 20, "chunk%d", i); 1353 fd = open((char *)&name[0], O_CREAT|O_WRONLY); 1354 stream_read(demuxer->stream, &buf[0], trak->length); 1355 write(fd, &buf[0], trak->length); 1356 close(fd); 1357 } 1358 if (trak->samplesize > 0) 1359 { 1360 char *buf; 1361 1362 buf = malloc(trak->samplesize); 1363 stream_seek(demuxer->stream, trak->chunks[0].pos); 1364 snprintf((char *)&name[0], 20, "trak%d", trak->id); 1365 fd = open((char *)&name[0], O_CREAT|O_WRONLY); 1366 stream_read(demuxer->stream, buf, trak->samplesize); 1367 write(fd, buf, trak->samplesize); 1368 close(fd); 1369 } 1370 stream_seek(demuxer->stream, pos); 1371 } 1372 #endif 1373 break; 807 1374 default: 808 dprintf( " MOV: unknown sound atom version (%d); may not work!\n", version);809 adjust = 68;1375 dprintf( "Unknown track type found (type: %d)\n", trak->type); 1376 break; 810 1377 } 811 if (trak->stdata_len >= 36 + adjust) { 812 int atom_len = char2int(trak->stdata,28+adjust); 813 switch(char2int(trak->stdata,32+adjust)) { // atom type 814 case MOV_FOURCC('e','s','d','s'): { 815 dprintf( "MOV: Found MPEG4 audio Elementary Stream Descriptor atom (%d)!\n", atom_len); 816 if(atom_len > 8) { 817 esds_t esds; 818 if(!mp4_parse_esds(&trak->stdata[36+adjust], atom_len-8, &esds)) { 819 /* 0xdd is a "user private" id, not an official allocated id (see http://www.mp4ra.org/object.html), 820 so perform some extra checks to be sure that this is really vorbis audio */ 821 if(esds.objectTypeId==0xdd && esds.streamType==0x15 && sh->format==0x6134706D && esds.decoderConfigLen > 8) 822 { 823 //vorbis audio 824 unsigned char *buf[3]; 825 unsigned short sizes[3]; 826 int offset, len, k; 827 unsigned char *ptr = esds.decoderConfig; 828 829 if(ptr[0] != 0 || ptr[1] != 30) goto quit_vorbis_block; //wrong extradata layout 830 831 offset = len = 0; 832 for(k = 0; k < 3; k++) 833 { 834 sizes[k] = (ptr[offset]<<8) | ptr[offset+1]; 835 len += sizes[k]; 836 offset += 2; 837 if(offset + sizes[k] > esds.decoderConfigLen) 838 { 839 dprintf("MOV: ERROR!, not enough vorbis extradata to read: offset = %d, k=%d, size=%d, len: %d\n", offset, k, sizes[k], esds.decoderConfigLen); 840 goto quit_vorbis_block; 841 } 842 buf[k] = malloc(sizes[k]); 843 if(!buf[k]) goto quit_vorbis_block; 844 memcpy(buf[k], &ptr[offset], sizes[k]); 845 offset += sizes[k]; 846 } 847 848 sh->codecdata_len = len + len/255 + 64; 849 sh->codecdata = malloc(sh->codecdata_len); 850 ptr = sh->codecdata; 851 852 ptr[0] = 2; 853 offset = 1; 854 offset += store_ughvlc(&ptr[offset], sizes[0]); 855 offset += store_ughvlc(&ptr[offset], sizes[1]); 856 for(k = 0; k < 3; k++) 857 { 858 memcpy(&ptr[offset], buf[k], sizes[k]); 859 offset += sizes[k]; 860 } 861 862 sh->codecdata_len = offset; 863 sh->codecdata = realloc(sh->codecdata, offset); 864 dprintf("demux_mov, vorbis extradata size: %d\n", offset); 865 is_vorbis = 1; 866 quit_vorbis_block: 867 sh->format = mmioFOURCC('v', 'r', 'b', 's'); 868 } 869 sh->i_bps = esds.avgBitrate/8; 870 871 // printf("######## audio format = %d ########\n",esds.objectTypeId); 872 if(esds.objectTypeId==MP4OTI_MPEG1Audio || esds.objectTypeId==MP4OTI_MPEG2AudioPart3) 873 sh->format=0x55; // .mp3 874 if(esds.objectTypeId==MP4OTI_13kVoice) { // 13K Voice, defined by 3GPP2 875 sh->format=mmioFOURCC('Q', 'c', 'l', 'p'); 876 trak->nchannels=sh->channels=1; 877 trak->samplebytes=sh->samplesize=1; 878 } 879 880 // dump away the codec specific configuration for the AAC decoder 881 if(esds.decoderConfigLen){ 882 if( (esds.decoderConfig[0]>>3) == 29 ) 883 sh->format = 0x1d61346d; // request multi-channel mp3 decoder 884 if(!is_vorbis) 885 { 886 sh->codecdata_len = esds.decoderConfigLen; 887 sh->codecdata = (unsigned char *)malloc(sh->codecdata_len); 888 memcpy(sh->codecdata, esds.decoderConfig, sh->codecdata_len); 889 } 890 } 891 } 892 mp4_free_esds(&esds); // freeup esds mem 893 #if 0 894 { FILE* f=fopen("esds.dat","wb"); 895 fwrite(&trak->stdata[36],atom_len-8,1,f); 896 fclose(f); } 897 #endif 898 } 899 } break; 900 case MOV_FOURCC('a','l','a','c'): { 901 dprintf( "MOV: Found alac atom (%d)!\n", atom_len); 902 if(atom_len > 8) { 903 // copy all the atom (not only payload) for lavc alac decoder 904 sh->codecdata_len = atom_len; 905 sh->codecdata = (unsigned char *)malloc(sh->codecdata_len); 906 memcpy(sh->codecdata, &trak->stdata[28], sh->codecdata_len); 907 } 908 } break; 909 case MOV_FOURCC('d','a','m','r'): 910 dprintf( "MOV: Found AMR audio atom %c%c%c%c (%d)!\n", trak->stdata[32+adjust],trak->stdata[33+adjust],trak->stdata[34+adjust],trak->stdata[35+adjust], atom_len); 911 if (atom_len>14) { 912 dprintf( "mov: vendor: %c%c%c%c Version: %d\n",trak->stdata[36+adjust],trak->stdata[37+adjust],trak->stdata[38+adjust], trak->stdata[39+adjust],trak->stdata[40+adjust]); 913 dprintf( "MOV: Modes set: %02x%02x\n",trak->stdata[41+adjust],trak->stdata[42+adjust]); 914 dprintf( "MOV: Mode change period: %d Frames per sample: %d\n",trak->stdata[43+adjust],trak->stdata[44+adjust]); 915 } 916 break; 917 default: 918 dprintf( "MOV: Found unknown audio atom %c%c%c%c (%d)!\n", 919 trak->stdata[32+adjust],trak->stdata[33+adjust],trak->stdata[34+adjust],trak->stdata[35+adjust], 920 atom_len); 921 } 922 } 923 dprintf( "Fourcc: %.4s\n",(char *)&trak->fourcc); 924 #if 0 925 { FILE* f=fopen("stdata.dat","wb"); 926 fwrite(trak->stdata,trak->stdata_len,1,f); 927 fclose(f); } 928 { FILE* f=fopen("tkdata.dat","wb"); 929 fwrite(trak->tkdata,trak->tkdata_len,1,f); 930 fclose(f); } 931 #endif 932 // Emulate WAVEFORMATEX struct: 933 sh->wf=malloc(sizeof(WAVEFORMATEX) + (is_vorbis ? sh->codecdata_len : 0)); 934 memset(sh->wf,0,sizeof(WAVEFORMATEX)); 935 sh->wf->nChannels=sh->channels; 936 sh->wf->wBitsPerSample=(trak->stdata[18]<<8)+trak->stdata[19]; 937 // sh->wf->nSamplesPerSec=trak->timescale; 938 sh->wf->nSamplesPerSec=sh->samplerate; 939 if(trak->stdata_len >= 44 && trak->stdata[9]>=1 && char2int(trak->stdata,28)>0){ 940 //Audio header: samp/pack=4096 bytes/pack=743 bytes/frame=1486 bytes/samp=2 941 sh->wf->nAvgBytesPerSec=(sh->wf->nChannels*sh->wf->nSamplesPerSec* 942 char2int(trak->stdata,32)+char2int(trak->stdata,28)/2) 943 /char2int(trak->stdata,28); 944 sh->wf->nBlockAlign=char2int(trak->stdata,36); 945 } else { 946 sh->wf->nAvgBytesPerSec=sh->wf->nChannels*sh->wf->wBitsPerSample*sh->wf->nSamplesPerSec/8; 947 // workaround for ms11 ima4 948 if (sh->format == 0x1100736d && trak->stdata_len >= 36) 949 sh->wf->nBlockAlign=char2int(trak->stdata,36); 950 } 951 if(is_vorbis && sh->codecdata_len) 952 { 953 memcpy(sh->wf+1, sh->codecdata, sh->codecdata_len); 954 sh->wf->cbSize = sh->codecdata_len; 955 } 956 // Selection: 957 // if(demuxer->audio->id==-1 || demuxer->audio->id==priv->track_db){ 958 // // (auto)selected audio track: 959 // demuxer->audio->id=priv->track_db; 960 // demuxer->audio->sh=sh; sh->ds=demuxer->audio; 961 // } 1378 dprintf( "--------------\n"); 1379 priv->track_db++; 1380 trak=NULL; 962 1381 break; 963 1382 } 964 case MOV_TRAK_VIDEO: { 965 int i, entry; 966 int flag, start, count_flag, end, palette_count, gray; 967 int hdr_ptr = 76; // the byte just after depth 968 unsigned char *palette_map; 969 sh_video_t* sh=new_sh_video(demuxer,priv->track_db); 970 int depth; 971 sh->format=trak->fourcc; 972 973 // crude video delay from editlist0 hack ::atm 974 if(trak->editlist_size>=1) { 975 if(trak->editlist[0].pos == -1) { 976 sh->stream_delay = (float)trak->editlist[0].dur/(float)priv->timescale; 977 dprintf("MOV: Initial Video-Delay: %.3f sec\n", sh->stream_delay); 978 } 979 } 980 981 if (trak->stdata_len < 78) { 982 dprintf("MOV: Invalid (%d bytes instead of >= 78) video trak desc\n", 983 trak->stdata_len); 1383 #ifndef HAVE_ZLIB 1384 case MOV_FOURCC('c','m','o','v'): { 1385 dprintf("MOV: got compressed header but have no zlib\n"); 1386 return; 1387 } 1388 #else 1389 case MOV_FOURCC('m','o','o','v'): 1390 case MOV_FOURCC('c','m','o','v'): { 1391 // dprintf(MSGTR_MOVcomprhdr); 1392 lschunks(demuxer,level+1,pos+len,NULL); 1393 break; 1394 } 1395 case MOV_FOURCC('d','c','o','m'): { 1396 // int temp=stream_read_dword(demuxer->stream); 1397 unsigned int algo=be2me_32(stream_read_dword(demuxer->stream)); 1398 dprintf( "Compressed header uses %.4s algo!\n",(char *)&algo); 1399 break; 1400 } 1401 case MOV_FOURCC('c','m','v','d'): { 1402 // int temp=stream_read_dword(demuxer->stream); 1403 unsigned int moov_sz=stream_read_dword(demuxer->stream); 1404 unsigned int cmov_sz=len-4; 1405 unsigned char* cmov_buf; 1406 unsigned char* moov_buf; 1407 int zret; 1408 z_stream zstrm; 1409 stream_t* backup; 1410 1411 if (moov_sz > 0xffffffff - 16) { 1412 dprintf("Invalid cmvd atom size %d\n", moov_sz); 984 1413 break; 985 1414 } 986 depth = trak->stdata[75] | (trak->stdata[74] << 8); 987 // stdata[]: 988 // 8 short version 989 // 10 short revision 990 // 12 int vendor_id 991 // 16 int temporal_quality 992 // 20 int spatial_quality 993 // 24 short width 994 // 26 short height 995 // 28 int h_dpi 996 // 32 int v_dpi 997 // 36 int 0 998 // 40 short frames_per_sample 999 // 42 char[4] compressor_name 1000 // 74 short depth 1001 // 76 short color_table_id 1002 // additional atoms may follow, 1003 // eg esds atom from .MP4 files 1004 // 78 int atom size 1005 // 82 char[4] atom type 1006 // 86 ... atom data 1007 1008 { ImageDescription* id=malloc(8+trak->stdata_len); // safe 1009 trak->desc=id; 1010 id->idSize=8+trak->stdata_len; 1011 // id->cType=bswap_32(trak->fourcc); 1012 id->cType=le2me_32(trak->fourcc); 1013 id->version=char2short(trak->stdata,8); 1014 id->revisionLevel=char2short(trak->stdata,10); 1015 id->vendor=char2int(trak->stdata,12); 1016 id->temporalQuality=char2int(trak->stdata,16); 1017 id->spatialQuality=char2int(trak->stdata,20); 1018 id->width=char2short(trak->stdata,24); 1019 id->height=char2short(trak->stdata,26); 1020 id->hRes=char2int(trak->stdata,28); 1021 id->vRes=char2int(trak->stdata,32); 1022 id->dataSize=char2int(trak->stdata,36); 1023 id->frameCount=char2short(trak->stdata,40); 1024 memcpy(&id->name,trak->stdata+42,32); 1025 id->depth=char2short(trak->stdata,74); 1026 id->clutID=char2short(trak->stdata,76); 1027 if(trak->stdata_len>78) memcpy(((char*)&id->clutID)+2,trak->stdata+78,trak->stdata_len-78); 1028 sh->ImageDesc=id; 1415 cmov_buf=malloc(cmov_sz); 1416 moov_buf=malloc(moov_sz+16); 1417 dprintf( "Compressed header size: %d / %d\n",cmov_sz,moov_sz); 1418 1419 stream_read(demuxer->stream,cmov_buf,cmov_sz); 1420 1421 zstrm.zalloc = (alloc_func)0; 1422 zstrm.zfree = (free_func)0; 1423 zstrm.opaque = (voidpf)0; 1424 zstrm.next_in = cmov_buf; 1425 zstrm.avail_in = cmov_sz; 1426 zstrm.next_out = moov_buf; 1427 zstrm.avail_out = moov_sz; 1428 1429 zret = inflateInit(&zstrm); 1430 if (zret != Z_OK) 1431 { dprintf( "QT cmov: inflateInit err %d\n",zret); 1432 return; 1433 } 1434 zret = inflate(&zstrm, Z_NO_FLUSH); 1435 if ((zret != Z_OK) && (zret != Z_STREAM_END)) 1436 { dprintf( "QT cmov inflate: ERR %d\n",zret); 1437 return; 1438 } 1029 1439 #if 0 1030 { FILE *f=fopen("ImageDescription","wb"); 1031 fwrite(id,id->idSize,1,f); 1032 fclose(f); 1440 else { 1441 FILE *DecOut; 1442 DecOut = fopen("Out.bin", "w"); 1443 fwrite(moov_buf, 1, moov_sz, DecOut); 1444 fclose(DecOut); 1033 1445 } 1034 1446 #endif 1035 } 1036 1037 if(trak->stdata_len >= 86) { // extra atoms found 1038 int pos=78; 1039 int atom_len; 1040 while(pos+8<=trak->stdata_len && 1041 (pos+(atom_len=char2int(trak->stdata,pos)))<=trak->stdata_len){ 1042 switch(char2int(trak->stdata,pos+4)) { // switch atom type 1043 case MOV_FOURCC('g','a','m','a'): 1044 // intfp with gamma value at which movie was captured 1045 // can be used to gamma correct movie display 1046 dprintf( "MOV: Found unsupported Gamma-Correction movie atom (%d)!\n", 1047 atom_len); 1048 break; 1049 case MOV_FOURCC('f','i','e','l'): 1050 // 2 char-values (8bit int) that specify field handling 1051 // see the Apple's QuickTime Fileformat PDF for more info 1052 dprintf( "MOV: Found unsupported Field-Handling movie atom (%d)!\n", 1053 atom_len); 1054 break; 1055 case MOV_FOURCC('m','j','q','t'): 1056 // Motion-JPEG default quantization table 1057 dprintf( "MOV: Found unsupported MJPEG-Quantization movie atom (%d)!\n", 1058 atom_len); 1059 break; 1060 case MOV_FOURCC('m','j','h','t'): 1061 // Motion-JPEG default huffman table 1062 dprintf( "MOV: Found unsupported MJPEG-Huffman movie atom (%d)!\n", 1063 atom_len); 1064 break; 1065 case MOV_FOURCC('e','s','d','s'): 1066 // MPEG4 Elementary Stream Descriptor header 1067 dprintf( "MOV: Found MPEG4 movie Elementary Stream Descriptor atom (%d)!\n", atom_len); 1068 // add code here to save esds header of length atom_len-8 1069 // beginning at stdata[86] to some variable to pass it 1070 // on to the decoder ::atmos 1071 if(atom_len > 8) { 1072 esds_t esds; 1073 if(!mp4_parse_esds(trak->stdata+pos+8, atom_len-8, &esds)) { 1074 1075 if(esds.objectTypeId==MP4OTI_MPEG2VisualSimple || esds.objectTypeId==MP4OTI_MPEG2VisualMain || 1076 esds.objectTypeId==MP4OTI_MPEG2VisualSNR || esds.objectTypeId==MP4OTI_MPEG2VisualSpatial || 1077 esds.objectTypeId==MP4OTI_MPEG2VisualHigh || esds.objectTypeId==MP4OTI_MPEG2Visual422) 1078 sh->format=mmioFOURCC('m', 'p', 'g', '2'); 1079 else if(esds.objectTypeId==MP4OTI_MPEG1Visual) 1080 sh->format=mmioFOURCC('m', 'p', 'g', '1'); 1081 1082 // dump away the codec specific configuration for the AAC decoder 1083 trak->stream_header_len = esds.decoderConfigLen; 1084 trak->stream_header = (unsigned char *)malloc(trak->stream_header_len); 1085 memcpy(trak->stream_header, esds.decoderConfig, trak->stream_header_len); 1447 if(moov_sz != zstrm.total_out) 1448 dprintf( "Warning! moov size differs cmov: %d zlib: %ld\n",moov_sz,zstrm.total_out); 1449 zret = inflateEnd(&zstrm); 1450 1451 backup=demuxer->stream; 1452 demuxer->stream=new_memory_stream(moov_buf,moov_sz); 1453 stream_skip(demuxer->stream,8); 1454 lschunks(demuxer,level+1,moov_sz,NULL); // parse uncompr. 'moov' 1455 //free_stream(demuxer->stream); 1456 demuxer->stream=backup; 1457 free(cmov_buf); 1458 free(moov_buf); 1459 break; 1460 } 1461 #endif 1462 case MOV_FOURCC('u','d','t','a'): 1463 { 1464 unsigned int udta_id; 1465 off_t udta_len; 1466 off_t udta_size = len; 1467 1468 dprintf( "mov: user data record found\n"); 1469 dprintf( "Quicktime Clip Info:\n"); 1470 1471 while((len > 8) && (udta_size > 8)) 1472 { 1473 udta_len = stream_read_dword(demuxer->stream); 1474 udta_id = stream_read_dword(demuxer->stream); 1475 udta_size -= 8; 1476 dprintf( "udta_id: %.4s (len: %"PRId64")\n", (char *)&udta_id, (int64_t)udta_len); 1477 switch (udta_id) 1478 { 1479 case MOV_FOURCC(0xa9,'c','p','y'): 1480 case MOV_FOURCC(0xa9,'d','a','y'): 1481 case MOV_FOURCC(0xa9,'d','i','r'): 1482 /* 0xa9,'e','d','1' - '9' : edit timestamps */ 1483 case MOV_FOURCC(0xa9,'f','m','t'): 1484 case MOV_FOURCC(0xa9,'i','n','f'): 1485 case MOV_FOURCC(0xa9,'p','r','d'): 1486 case MOV_FOURCC(0xa9,'p','r','f'): 1487 case MOV_FOURCC(0xa9,'r','e','q'): 1488 case MOV_FOURCC(0xa9,'s','r','c'): 1489 case MOV_FOURCC('n','a','m','e'): 1490 case MOV_FOURCC(0xa9,'n','a','m'): 1491 case MOV_FOURCC(0xa9,'A','R','T'): 1492 case MOV_FOURCC(0xa9,'c','m','t'): 1493 case MOV_FOURCC(0xa9,'a','u','t'): 1494 case MOV_FOURCC(0xa9,'s','w','r'): 1495 { 1496 off_t text_len = stream_read_word(demuxer->stream); 1497 char text[text_len+2+1]; 1498 stream_read(demuxer->stream, (char *)&text, text_len+2); 1499 text[text_len+2] = 0x0; 1500 switch(udta_id) 1501 { 1502 case MOV_FOURCC(0xa9,'a','u','t'): 1503 demux_info_add(demuxer, "author", &text[2]); 1504 dprintf( " Author: %s\n", &text[2]); 1505 break; 1506 case MOV_FOURCC(0xa9,'c','p','y'): 1507 demux_info_add(demuxer, "copyright", &text[2]); 1508 dprintf( " Copyright: %s\n", &text[2]); 1509 break; 1510 case MOV_FOURCC(0xa9,'i','n','f'): 1511 dprintf( " Info: %s\n", &text[2]); 1512 break; 1513 case MOV_FOURCC('n','a','m','e'): 1514 case MOV_FOURCC(0xa9,'n','a','m'): 1515 demux_info_add(demuxer, "name", &text[2]); 1516 dprintf( " Name: %s\n", &text[2]); 1517 break; 1518 case MOV_FOURCC(0xa9,'A','R','T'): 1519 dprintf( " Artist: %s\n", &text[2]); 1520 break; 1521 case MOV_FOURCC(0xa9,'d','i','r'): 1522 dprintf( " Director: %s\n", &text[2]); 1523 break; 1524 case MOV_FOURCC(0xa9,'c','m','t'): 1525 demux_info_add(demuxer, "comments", &text[2]); 1526 dprintf( " Comment: %s\n", &text[2]); 1527 break; 1528 case MOV_FOURCC(0xa9,'r','e','q'): 1529 dprintf( " Requirements: %s\n", &text[2]); 1530 break; 1531 case MOV_FOURCC(0xa9,'s','w','r'): 1532 demux_info_add(demuxer, "encoder", &text[2]); 1533 dprintf( " Software: %s\n", &text[2]); 1534 break; 1535 case MOV_FOURCC(0xa9,'d','a','y'): 1536 dprintf( " Creation timestamp: %s\n", &text[2]); 1537 break; 1538 case MOV_FOURCC(0xa9,'f','m','t'): 1539 dprintf( " Format: %s\n", &text[2]); 1540 break; 1541 case MOV_FOURCC(0xa9,'p','r','d'): 1542 dprintf( " Producer: %s\n", &text[2]); 1543 break; 1544 case MOV_FOURCC(0xa9,'p','r','f'): 1545 dprintf( " Performer(s): %s\n", &text[2]); 1546 break; 1547 case MOV_FOURCC(0xa9,'s','r','c'): 1548 dprintf( " Source providers: %s\n", &text[2]); 1549 break; 1086 1550 } 1087 mp4_free_esds(&esds); // freeup esds mem 1551 udta_size -= 4+text_len; 1552 break; 1088 1553 } 1089 break; 1090 case MOV_FOURCC('a','v','c','C'): 1091 // AVC decoder configuration record 1092 dprintf( "MOV: AVC decoder configuration record atom (%d)!\n", atom_len); 1093 if(atom_len > 8) { 1094 int i, poffs, cnt; 1095 // Parse some parts of avcC, just for fun :) 1096 // real parsing is done by avc1 decoder 1097 dprintf( "MOV: avcC version: %d\n", *(trak->stdata+pos+8)); 1098 if (*(trak->stdata+pos+8) != 1) 1099 dprintf( "MOV: unknown avcC version (%d). Expexct problems.\n", *(trak->stdata+pos+9)); 1100 dprintf( "MOV: avcC profile: %d\n", *(trak->stdata+pos+9)); 1101 dprintf( "MOV: avcC profile compatibility: %d\n", *(trak->stdata+pos+10)); 1102 dprintf( "MOV: avcC level: %d\n", *(trak->stdata+pos+11)); 1103 dprintf( "MOV: avcC nal length size: %d\n", ((*(trak->stdata+pos+12))&0x03)+1); 1104 dprintf( "MOV: avcC number of sequence param sets: %d\n", cnt = (*(trak->stdata+pos+13) & 0x1f)); 1105 poffs = pos + 14; 1106 for (i = 0; i < cnt; i++) { 1107 dprintf( "MOV: avcC sps %d have length %d\n", i, BE_16(trak->stdata+poffs)); 1108 poffs += BE_16(trak->stdata+poffs) + 2; 1109 } 1110 dprintf( "MOV: avcC number of picture param sets: %d\n", *(trak->stdata+poffs)); 1111 poffs++; 1112 for (i = 0; i < cnt; i++) { 1113 dprintf( "MOV: avcC pps %d have length %d\n", i, BE_16(trak->stdata+poffs)); 1114 poffs += BE_16(trak->stdata+poffs) + 2; 1115 } 1116 // Copy avcC for the AVC decoder 1117 // This data will be put in extradata below, where BITMAPINFOHEADER is created 1118 trak->stream_header_len = atom_len-8; 1119 trak->stream_header = (unsigned char *)malloc(trak->stream_header_len); 1120 memcpy(trak->stream_header, trak->stdata+pos+8, trak->stream_header_len); 1121 } 1122 break; 1123 case MOV_FOURCC('d','2','6','3'): 1124 dprintf( "MOV: Found H.263 decoder atom %c%c%c%c (%d)!\n", trak->stdata[pos+4],trak->stdata[pos+5],trak->stdata[pos+6],trak->stdata[pos+7],atom_len); 1125 if (atom_len>10) 1126 dprintf( "MOV: Vendor: %c%c%c%c H.263 level: %d H.263 profile: %d \n", trak->stdata[pos+8],trak->stdata[pos+9],trak->stdata[pos+10],trak->stdata[pos+11],trak->stdata[pos+12],trak->stdata[pos+13]); 1127 break; 1128 case 0: 1129 break; 1554 /* some other shits: WLOC - window location, 1555 LOOP - looping style, 1556 SelO - play only selected frames 1557 AllF - play all frames 1558 */ 1559 case MOV_FOURCC('W','L','O','C'): 1560 case MOV_FOURCC('L','O','O','P'): 1561 case MOV_FOURCC('S','e','l','O'): 1562 case MOV_FOURCC('A','l','l','F'): 1130 1563 default: 1131 dprintf( "MOV: Found unknown movie atom %c%c%c%c (%d)!\n", 1132 trak->stdata[pos+4],trak->stdata[pos+5],trak->stdata[pos+6],trak->stdata[pos+7], 1133 atom_len); 1134 } 1135 if(atom_len<8) break; 1136 pos+=atom_len; 1137 // printf("pos=%d max=%d\n",pos,trak->stdata_len); 1138 } 1139 } 1140 sh->fps=trak->timescale/ 1141 ((trak->durmap_size>=1)?(float)trak->durmap[0].dur:1); 1142 sh->frametime=1.0f/sh->fps; 1143 1144 sh->disp_w=trak->stdata[25]|(trak->stdata[24]<<8); 1145 sh->disp_h=trak->stdata[27]|(trak->stdata[26]<<8); 1146 // if image size is zero, fallback to display size 1147 if(!sh->disp_w && !sh->disp_h) { 1148 sh->disp_w=trak->tkdata[77]|(trak->tkdata[76]<<8); 1149 sh->disp_h=trak->tkdata[81]|(trak->tkdata[80]<<8); 1150 } else if(sh->disp_w!=(trak->tkdata[77]|(trak->tkdata[76]<<8))){ 1151 // codec and display width differ... use display one for aspect 1152 sh->aspect=trak->tkdata[77]|(trak->tkdata[76]<<8); 1153 sh->aspect/=trak->tkdata[81]|(trak->tkdata[80]<<8); 1154 } 1155 1156 if(depth>32+8) printf("*** depth = 0x%X\n",depth); 1157 1158 // palettized? 1159 gray = 0; 1160 if (depth > 32) { depth&=31; gray = 1; } // depth > 32 means grayscale 1161 if ((depth == 2) || (depth == 4) || (depth == 8)) 1162 palette_count = (1 << depth); 1163 else 1164 palette_count = 0; 1165 1166 // emulate BITMAPINFOHEADER: 1167 if (palette_count) 1168 { 1169 sh->bih=malloc(sizeof(BITMAPINFOHEADERw) + palette_count * 4); 1170 memset(sh->bih,0,sizeof(BITMAPINFOHEADERw) + palette_count * 4); 1171 sh->bih->biSize=40 + palette_count * 4; 1172 // fetch the relevant fields 1173 flag = BE_16(&trak->stdata[hdr_ptr]); 1174 hdr_ptr += 2; 1175 start = BE_32(&trak->stdata[hdr_ptr]); 1176 hdr_ptr += 4; 1177 count_flag = BE_16(&trak->stdata[hdr_ptr]); 1178 hdr_ptr += 2; 1179 end = BE_16(&trak->stdata[hdr_ptr]); 1180 hdr_ptr += 2; 1181 palette_map = (unsigned char *)sh->bih + 40; 1182 dprintf( "Allocated %d entries for palette\n", 1183 palette_count); 1184 dprintf( "QT palette: start: %x, end: %x, count flag: %d, flags: %x\n", 1185 start, end, count_flag, flag); 1186 1187 /* XXX: problems with sample (statunit6.mov) with flag&0x4 set! - alex*/ 1188 1189 // load default palette 1190 if (flag & 0x08) 1191 { 1192 if (gray) 1193 { 1194 dprintf( "Using default QT grayscale palette\n"); 1195 if (palette_count == 16) 1196 memcpy(palette_map, qt_default_grayscale_palette_16, 16 * 4); 1197 else if (palette_count == 256) { 1198 memcpy(palette_map, qt_default_grayscale_palette_256, 256 * 4); 1199 if (trak->fourcc == mmioFOURCC('c','v','i','d')) { 1200 int i; 1201 // Hack for grayscale CVID, negative palette 1202 // If you have samples where this is not required contact me (rxt) 1203 dprintf( "MOV: greyscale cvid with default palette," 1204 " enabling negative palette hack.\n"); 1205 for (i = 0; i < 256 * 4; i++) 1206 palette_map[i] = palette_map[i] ^ 0xff; 1564 { 1565 if( udta_len>udta_size) 1566 udta_len=udta_size; 1567 { 1568 char dump[udta_len-4]; 1569 stream_read(demuxer->stream, (char *)&dump, udta_len-4-4); 1570 udta_size -= udta_len; 1207 1571 } 1208 1572 } 1209 1573 } 1210 else1211 {1212 dprintf( "Using default QT colour palette\n");1213 if (palette_count == 4)1214 memcpy(palette_map, qt_default_palette_4, 4 * 4);1215 else if (palette_count == 16)1216 memcpy(palette_map, qt_default_palette_16, 16 * 4);1217 else if (palette_count == 256)1218 memcpy(palette_map, qt_default_palette_256, 256 * 4);1219 }1220 1574 } 1221 // load palette from file 1222 else 1223 { 1224 dprintf( "Loading palette from file\n"); 1225 for (i = start; i <= end; i++) 1226 { 1227 entry = BE_16(&trak->stdata[hdr_ptr]); 1228 hdr_ptr += 2; 1229 // apparently, if count_flag is set, entry is same as i 1230 if (count_flag & 0x8000) 1231 entry = i; 1232 // only care about top 8 bits of 16-bit R, G, or B value 1233 if (entry <= palette_count && entry >= 0) 1234 { 1235 palette_map[entry * 4 + 2] = trak->stdata[hdr_ptr + 0]; 1236 palette_map[entry * 4 + 1] = trak->stdata[hdr_ptr + 2]; 1237 palette_map[entry * 4 + 0] = trak->stdata[hdr_ptr + 4]; 1238 dprintf("QT palette: added entry: %d of %d (colors: R:%x G:%x B:%x)\n", 1239 entry, palette_count, 1240 palette_map[entry * 4 + 2], 1241 palette_map[entry * 4 + 1], 1242 palette_map[entry * 4 + 0]); 1243 } 1244 else 1245 dprintf( "QT palette: skipped entry (out of count): %d of %d\n", 1246 entry, palette_count); 1247 hdr_ptr += 6; 1248 } 1249 } 1250 } 1251 else 1252 { 1253 if (trak->fourcc == mmioFOURCC('a','v','c','1')) { 1254 if (trak->stream_header_len > 0xffffffff - sizeof(BITMAPINFOHEADERw)) { 1255 dprintf("Invalid extradata size %d, skipping\n"); 1256 trak->stream_header_len = 0; 1257 } 1258 1259 sh->bih=malloc(sizeof(BITMAPINFOHEADERw) + trak->stream_header_len); 1260 memset(sh->bih,0,sizeof(BITMAPINFOHEADERw) + trak->stream_header_len); 1261 sh->bih->biSize=40 + trak->stream_header_len; 1262 memcpy(((unsigned char *)sh->bih)+40, trak->stream_header, trak->stream_header_len); 1263 free (trak->stream_header); 1264 trak->stream_header_len = 0; 1265 trak->stream_header = NULL; 1266 } else { 1267 sh->bih=malloc(sizeof(BITMAPINFOHEADERw)); 1268 memset(sh->bih,0,sizeof(BITMAPINFOHEADERw)); 1269 sh->bih->biSize=40; 1270 } 1271 } 1272 sh->bih->biWidth=sh->disp_w; 1273 sh->bih->biHeight=sh->disp_h; 1274 sh->bih->biPlanes=0; 1275 sh->bih->biBitCount=depth; 1276 sh->bih->biCompression=trak->fourcc; 1277 sh->bih->biSizeImage=sh->bih->biWidth*sh->bih->biHeight; 1278 1279 dprintf( "Image size: %d x %d (%d bpp)\n",sh->disp_w,sh->disp_h,sh->bih->biBitCount); 1280 if(trak->tkdata_len>81) 1281 dprintf( "Display size: %d x %d\n", 1282 trak->tkdata[77]|(trak->tkdata[76]<<8), 1283 trak->tkdata[81]|(trak->tkdata[80]<<8)); 1284 dprintf( "Fourcc: %.4s Codec: '%.*s'\n",(char *)&trak->fourcc,trak->stdata[42]&31,trak->stdata+43); 1285 1286 // if(demuxer->video->id==-1 || demuxer->video->id==priv->track_db){ 1287 // // (auto)selected video track: 1288 // demuxer->video->id=priv->track_db; 1289 // demuxer->video->sh=sh; sh->ds=demuxer->video; 1290 // } 1575 break; 1576 } /* eof udta */ 1577 default: 1578 id = be2me_32(id); 1579 dprintf("MOV: unknown chunk: %.4s %d\n",(char *)&id,(int)len); 1580 } /* endof switch */ 1581 } /* endof else */ 1582 1583 pos+=len+8; 1584 if(pos>=endpos) break; 1585 if(!stream_seek(demuxer->stream,pos)) break; 1586 } 1587 } 1588 1589 static int lschunks_intrak(demuxer_t* demuxer, int level, unsigned int id, 1590 off_t pos, off_t len, mov_track_t* trak) 1591 { 1592 switch(id) { 1593 case MOV_FOURCC('m','d','a','t'): { 1594 dprintf("Hmm, strange MOV, parsing mdat in lschunks?\n"); 1595 return -1; 1596 } 1597 case MOV_FOURCC('f','r','e','e'): 1598 case MOV_FOURCC('u','d','t','a'): 1599 /* here not supported :p */ 1600 break; 1601 case MOV_FOURCC('t','k','h','d'): { 1602 dprintf("MOV: %*sTrack header!\n", level, ""); 1603 // read codec data 1604 trak->tkdata_len = len; 1605 trak->tkdata = malloc(trak->tkdata_len); 1606 stream_read(demuxer->stream, trak->tkdata, trak->tkdata_len); 1607 /* 1608 0 1 Version 1609 1 3 Flags 1610 4 4 Creation time 1611 8 4 Modification time 1612 12 4 Track ID 1613 16 4 Reserved 1614 20 4 Duration 1615 24 8 Reserved 1616 32 2 Layer 1617 34 2 Alternate group 1618 36 2 Volume 1619 38 2 Reserved 1620 40 36 Matrix structure 1621 76 4 Track width 1622 80 4 Track height 1623 */ 1624 dprintf( 1625 "tkhd len=%d ver=%d flags=0x%X id=%d dur=%d lay=%d vol=%d\n", 1626 trak->tkdata_len, trak->tkdata[0], trak->tkdata[1], 1627 char2int(trak->tkdata, 12), // id 1628 char2int(trak->tkdata, 20), // duration 1629 char2short(trak->tkdata, 32), // layer 1630 char2short(trak->tkdata, 36)); // volume 1631 break; 1632 } 1633 case MOV_FOURCC('m','d','h','d'): { 1634 dprintf( "MOV: %*sMedia header!\n", level, ""); 1635 int version = stream_read_char(demuxer->stream); 1636 stream_skip(demuxer->stream, (version == 1) ? 19 : 11); 1637 // read timescale 1638 trak->timescale = stream_read_dword(demuxer->stream); 1639 // read length 1640 if (version == 1) 1641 trak->length = stream_read_qword(demuxer->stream); 1642 else 1643 trak->length = stream_read_dword(demuxer->stream); 1644 break; 1645 } 1646 case MOV_FOURCC('h','d','l','r'): { 1647 unsigned int tmp = stream_read_dword(demuxer->stream); 1648 unsigned int type = stream_read_dword_le(demuxer->stream); 1649 unsigned int subtype = stream_read_dword_le(demuxer->stream); 1650 unsigned int manufact = stream_read_dword_le(demuxer->stream); 1651 unsigned int comp_flags = stream_read_dword(demuxer->stream); 1652 unsigned int comp_mask = stream_read_dword(demuxer->stream); 1653 int len = stream_read_char(demuxer->stream); 1654 char* str = malloc(len + 1); 1655 stream_read(demuxer->stream, str, len); 1656 str[len] = 0; 1657 dprintf( 1658 "MOV: %*sHandler header: %.4s/%.4s (%.4s) %s\n", level, "", 1659 (char *)&type, (char *)&subtype, (char *)&manufact, str); 1660 free(str); 1661 switch(bswap_32(type)) { 1662 case MOV_FOURCC('m','h','l','r'): 1663 trak->media_handler = bswap_32(subtype); 1664 break; 1665 case MOV_FOURCC('d','h','l','r'): 1666 trak->data_handler = bswap_32(subtype); 1667 break; 1668 default: 1669 dprintf( 1670 "MOV: unknown handler class: 0x%X (%.4s)\n", 1671 bswap_32(type), (char *)&type); 1672 } 1673 break; 1674 } 1675 case MOV_FOURCC('v','m','h','d'): { 1676 dprintf("MOV: %*sVideo header!\n", level, ""); 1677 trak->type = MOV_TRAK_VIDEO; 1678 // read video data 1679 break; 1680 } 1681 case MOV_FOURCC('s','m','h','d'): { 1682 dprintf("MOV: %*sSound header!\n", level, ""); 1683 trak->type = MOV_TRAK_AUDIO; 1684 // read audio data 1685 break; 1686 } 1687 case MOV_FOURCC('g','m','h','d'): { 1688 dprintf("MOV: %*sGeneric header!\n", level, ""); 1689 trak->type = MOV_TRAK_GENERIC; 1690 break; 1691 } 1692 case MOV_FOURCC('n','m','h','d'): { 1693 dprintf("MOV: %*sGeneric header!\n", level, ""); 1694 trak->type = MOV_TRAK_GENERIC; 1695 break; 1696 } 1697 case MOV_FOURCC('s','t','s','d'): { 1698 int i = stream_read_dword(demuxer->stream); // temp! 1699 int count = stream_read_dword(demuxer->stream); 1700 dprintf("MOV: %*sDescription list! (cnt:%d)\n", 1701 level, "", count); 1702 for (i = 0; i < count; i++) { 1703 off_t pos = stream_tell(demuxer->stream); 1704 off_t len = stream_read_dword(demuxer->stream); 1705 unsigned int fourcc = stream_read_dword_le(demuxer->stream); 1706 /* some files created with Broadcast 2000 (e.g. ilacetest.mov) 1707 contain raw I420 video but have a yv12 fourcc */ 1708 if (fourcc == mmioFOURCC('y','v','1','2')) 1709 fourcc = mmioFOURCC('I','4','2','0'); 1710 if (len < 8) 1711 break; // error 1712 dprintf("MOV: %*s desc #%d: %.4s (%"PRId64" bytes)\n", level, "", 1713 i, (char *)&fourcc, (int64_t)len - 16); 1714 if (fourcc != trak->fourcc && i) 1715 dprintf("MOW: warning - different fourcc\n"); 1716 // if(!i) 1717 { 1718 trak->fourcc = fourcc; 1719 // read type specific (audio/video/time/text etc) header 1720 // NOTE: trak type is not yet known at this point :((( 1721 trak->stdata_len = len - 8; 1722 trak->stdata = malloc(trak->stdata_len); 1723 stream_read(demuxer->stream, trak->stdata, trak->stdata_len); 1724 } 1725 if (!stream_seek(demuxer->stream, pos + len)) 1726 break; 1727 } 1728 break; 1729 } 1730 case MOV_FOURCC('s','t','t','s'): { 1731 int temp = stream_read_dword(demuxer->stream); 1732 int len = stream_read_dword(demuxer->stream); 1733 int i; 1734 unsigned int pts = 0; 1735 dprintf("MOV: %*sSample duration table! (%d blocks)\n", level, "", 1736 len); 1737 trak->durmap = calloc(len, sizeof(mov_durmap_t)); 1738 trak->durmap_size = len; 1739 for (i = 0; i < len; i++) { 1740 trak->durmap[i].num = stream_read_dword(demuxer->stream); 1741 trak->durmap[i].dur = stream_read_dword(demuxer->stream); 1742 pts += trak->durmap[i].num * trak->durmap[i].dur; 1743 } 1744 if (trak->length != pts) 1745 dprintf( "Warning! pts=%d length=%d\n", 1746 pts, trak->length); 1747 break; 1748 } 1749 case MOV_FOURCC('s','t','s','c'): { 1750 int temp = stream_read_dword(demuxer->stream); 1751 int len = stream_read_dword(demuxer->stream); 1752 int ver = (temp << 24); 1753 int flags = (temp << 16) | (temp << 8) | temp; 1754 int i; 1755 dprintf("MOV: %*sSample->Chunk mapping table! (%d blocks) (ver:%d,flags:%d)\n", level, "", 1756 len, ver, flags); 1757 // read data: 1758 trak->chunkmap_size = len; 1759 trak->chunkmap = calloc(len, sizeof(mov_chunkmap_t)); 1760 for (i = 0; i < len; i++) { 1761 trak->chunkmap[i].first = stream_read_dword(demuxer->stream) - 1; 1762 trak->chunkmap[i].spc = stream_read_dword(demuxer->stream); 1763 trak->chunkmap[i].sdid = stream_read_dword(demuxer->stream); 1764 } 1765 break; 1766 } 1767 case MOV_FOURCC('s','t','s','z'): { 1768 int temp = stream_read_dword(demuxer->stream); 1769 int ss=stream_read_dword(demuxer->stream); 1770 int ver = (temp << 24); 1771 int flags = (temp << 16) | (temp << 8) | temp; 1772 int entries = stream_read_dword(demuxer->stream); 1773 int i; 1774 dprintf( 1775 "MOV: %*sSample size table! (entries=%d ss=%d) (ver:%d,flags:%d)\n", level, "", 1776 entries, ss, ver, flags); 1777 trak->samplesize = ss; 1778 if (!ss) { 1779 // variable samplesize 1780 trak->samples = realloc_struct(trak->samples, entries, sizeof(mov_sample_t)); 1781 trak->samples_size = entries; 1782 for (i = 0; i < entries; i++) 1783 trak->samples[i].size = stream_read_dword(demuxer->stream); 1784 } 1785 break; 1786 } 1787 case MOV_FOURCC('s','t','c','o'): { 1788 int temp = stream_read_dword(demuxer->stream); 1789 int len = stream_read_dword(demuxer->stream); 1790 int i; 1791 dprintf( 1792 "MOV: %*sChunk offset table! (%d chunks)\n", level, "", 1793 len); 1794 // extend array if needed: 1795 if (len > trak->chunks_size) { 1796 trak->chunks = realloc_struct(trak->chunks, len, sizeof(mov_chunk_t)); 1797 trak->chunks_size = len; 1798 } 1799 // read elements: 1800 for(i = 0; i < len; i++) 1801 trak->chunks[i].pos = stream_read_dword(demuxer->stream); 1802 break; 1803 } 1804 case MOV_FOURCC('c','o','6','4'): { 1805 int temp = stream_read_dword(demuxer->stream); 1806 int len = stream_read_dword(demuxer->stream); 1807 int i; 1808 dprintf( 1809 "MOV: %*s64bit chunk offset table! (%d chunks)\n", level, "", 1810 len); 1811 // extend array if needed: 1812 if (len > trak->chunks_size) { 1813 trak->chunks = realloc_struct(trak->chunks, len, sizeof(mov_chunk_t)); 1814 trak->chunks_size = len; 1815 } 1816 // read elements: 1817 for (i = 0; i < len; i++) { 1818 #ifndef _LARGEFILE_SOURCE 1819 if (stream_read_dword(demuxer->stream) != 0) 1820 dprintf( "Chunk %d has got 64bit address, but you've MPlayer compiled without LARGEFILE support!\n", i); 1821 trak->chunks[i].pos = stream_read_dword(demuxer->stream); 1822 #else 1823 trak->chunks[i].pos = stream_read_qword(demuxer->stream); 1824 #endif 1825 } 1826 break; 1827 } 1828 case MOV_FOURCC('s','t','s','s'): { 1829 int temp = stream_read_dword(demuxer->stream); 1830 int entries = stream_read_dword(demuxer->stream); 1831 int ver = (temp << 24); 1832 int flags = (temp << 16) | (temp<<8) | temp; 1833 int i; 1834 dprintf( 1835 "MOV: %*sSyncing samples (keyframes) table! (%d entries) (ver:%d,flags:%d)\n", level, "", 1836 entries, ver, flags); 1837 trak->keyframes_size = entries; 1838 trak->keyframes = calloc(entries, sizeof(unsigned int)); 1839 for (i = 0; i < entries; i++) 1840 trak->keyframes[i] = stream_read_dword(demuxer->stream) - 1; 1841 break; 1842 } 1843 case MOV_FOURCC('m','d','i','a'): { 1844 dprintf( "MOV: %*sMedia stream!\n", level, ""); 1845 lschunks(demuxer, level + 1, pos + len, trak); 1846 break; 1847 } 1848 case MOV_FOURCC('m','i','n','f'): { 1849 dprintf( "MOV: %*sMedia info!\n", level, ""); 1850 lschunks(demuxer, level + 1 ,pos + len, trak); 1851 break; 1852 } 1853 case MOV_FOURCC('s','t','b','l'): { 1854 dprintf( "MOV: %*sSample info!\n", level, ""); 1855 lschunks(demuxer, level + 1, pos + len, trak); 1856 break; 1857 } 1858 case MOV_FOURCC('e','d','t','s'): { 1859 dprintf( "MOV: %*sEdit atom!\n", level, ""); 1860 lschunks(demuxer, level + 1, pos + len, trak); 1861 break; 1862 } 1863 case MOV_FOURCC('e','l','s','t'): { 1864 int temp = stream_read_dword(demuxer->stream); 1865 int entries = stream_read_dword(demuxer->stream); 1866 int ver = (temp << 24); 1867 int flags = (temp << 16) | (temp << 8) | temp; 1868 int i; 1869 dprintf( 1870 "MOV: %*sEdit list table (%d entries) (ver:%d,flags:%d)\n", level, "", 1871 entries, ver, flags); 1872 #if 1 1873 trak->editlist_size = entries; 1874 trak->editlist = calloc(trak->editlist_size, sizeof(mov_editlist_t)); 1875 for (i = 0; i < entries; i++) { 1876 int dur = stream_read_dword(demuxer->stream); 1877 int mt = stream_read_dword(demuxer->stream); 1878 int mr = stream_read_dword(demuxer->stream); // 16.16fp 1879 trak->editlist[i].dur = dur; 1880 trak->editlist[i].pos = mt; 1881 trak->editlist[i].speed = mr; 1882 dprintf( 1883 "MOV: %*s entry#%d: duration: %d start time: %d speed: %3.1fx\n", level, "", 1884 i, dur, mt, (float)mr/65536.0f); 1885 } 1886 #endif 1887 break; 1888 } 1889 case MOV_FOURCC('c','o','d','e'): { 1890 /* XXX: Implement atom 'code' for FLASH support */ 1891 break; 1892 } 1893 default: 1894 id = be2me_32(id); 1895 dprintf("MOV: unknown chunk: %.4s %d\n",(char *)&id,(int)len); 1896 break; 1897 }//switch(id) 1898 return 0; 1899 } 1900 1901 static demuxer_t* mov_read_header(demuxer_t* demuxer){ 1902 mov_priv_t* priv=demuxer->priv; 1903 int t_no; 1904 int best_a_id=-1, best_a_len=0; 1905 int best_v_id=-1, best_v_len=0; 1906 1907 dprintf( "mov_read_header!\n"); 1908 1909 // Parse header: 1910 stream_reset(demuxer->stream); 1911 if(!stream_seek(demuxer->stream,priv->moov_start)) 1912 { 1913 dprintf("MOV: Cannot seek to the beginning of the Movie header (0x%"PRIx64")\n", 1914 (int64_t)priv->moov_start); 1915 return 0; 1916 } 1917 lschunks(demuxer, 0, priv->moov_end, NULL); 1918 // just in case we have hit eof while parsing... 1919 demuxer->stream->eof = 0; 1920 // dprintf( "--------------\n"); 1921 1922 // find the best (longest) streams: 1923 for(t_no=0;t_no<priv->track_db;t_no++){ 1924 mov_track_t* trak=priv->tracks[t_no]; 1925 int len=(trak->samplesize) ? trak->chunks_size : trak->samples_size; 1926 if(demuxer->a_streams[t_no]){ // need audio 1927 if(len>best_a_len){ best_a_len=len; best_a_id=t_no; } 1928 } 1929 if(demuxer->v_streams[t_no]){ // need video 1930 if(len>best_v_len){ best_v_len=len; best_v_id=t_no; } 1931 } 1932 } 1933 dprintf( "MOV: longest streams: A: #%d (%d samples) V: #%d (%d samples)\n", 1934 best_a_id,best_a_len,best_v_id,best_v_len); 1935 if(demuxer->audio->id==-1 && best_a_id>=0) demuxer->audio->id=best_a_id; 1936 if(demuxer->video->id==-1 && best_v_id>=0) demuxer->video->id=best_v_id; 1937 1938 // setup sh pointers: 1939 if(demuxer->audio->id>=0){ 1940 sh_audio_t* sh=demuxer->a_streams[demuxer->audio->id]; 1941 if(sh){ 1942 demuxer->audio->sh=sh; sh->ds=demuxer->audio; 1943 } else { 1944 dprintf( "MOV: selected audio stream (%d) does not exists\n",demuxer->audio->id); 1945 demuxer->audio->id=-2; 1946 } 1947 } 1948 if(demuxer->video->id>=0){ 1949 sh_video_t* sh=demuxer->v_streams[demuxer->video->id]; 1950 if(sh){ 1951 demuxer->video->sh=sh; sh->ds=demuxer->video; 1952 } else { 1953 dprintf( "MOV: selected video stream (%d) does not exists\n",demuxer->video->id); 1954 demuxer->video->id=-2; 1955 } 1956 } 1957 1958 if(demuxer->sub->id>=0){ 1959 sh_sub_t* sh=demuxer->s_streams[demuxer->sub->id]; 1960 if(sh){ 1961 demuxer->sub->sh=sh; 1962 } else { 1963 dprintf("MOV: selected video stream (%d) does not exists\n",demuxer->video->id); 1964 demuxer->sub->id=-2; 1965 } 1966 } 1967 if(demuxer->video->id<0 && demuxer->audio->id<0) { 1968 /* No AV streams found. Try to find an MPEG stream. */ 1969 for(t_no=0;t_no<priv->track_db;t_no++){ 1970 mov_track_t* trak=priv->tracks[t_no]; 1971 if(trak->media_handler == MOV_FOURCC('M','P','E','G')) { 1972 stream_t *s; 1973 demuxer_t *od; 1974 1975 demuxer->video->id = t_no; 1976 s = new_ds_stream(demuxer->video); 1977 od = demux_open(s, DEMUXER_TYPE_MPEG_PS, -1, -1, -1, NULL); 1978 if(od) return new_demuxers_demuxer(od, od, od); 1979 demuxer->video->id = -2; //new linked demuxer couldn't be allocated 1291 1980 break; 1292 1981 } 1293 case MOV_TRAK_GENERIC: 1294 dprintf( "Generic track - not completely understood! (id: %d)\n", 1295 trak->id); 1296 /* XXX: Also this contains the FLASH data */ 1982 } 1983 } 1297 1984 1298 1985 #if 0 1986 if( mp_msg_test(MSGL_DBG3) ){ 1987 for(t_no=0;t_no<priv->track_db;t_no++){ 1988 mov_track_t* trak=priv->tracks[t_no]; 1989 if(trak->type==MOV_TRAK_GENERIC){ 1990 int i; 1991 int fd; 1992 char name[20]; 1993 dprintf( "MOV: Track #%d: Extracting %d data chunks to files\n",t_no,trak->samples_size); 1994 for (i=0; i<trak->samples_size; i++) 1299 1995 { 1300 int pos = stream_tell(demuxer->stream); 1301 int i; 1302 int fd; 1303 char name[20]; 1304 1305 for (i=0; i<trak->samples_size; i++) 1996 int len=trak->samples[i].size; 1997 char buf[len]; 1998 stream_seek(demuxer->stream, trak->samples[i].pos); 1999 snprintf(name, 20, "t%02d-s%03d.%s", t_no,i, 2000 (trak->media_handler==MOV_FOURCC('f','l','s','h')) ? 2001 "swf":"dump"); 2002 fd = open(name, O_CREAT|O_WRONLY); 2003 // { int j; 2004 // for(j=0;j<trak->stdata_len-3; j++) 2005 // printf("stdata[%d]=0x%X ize=0x%X\n",j,char2int(trak->stdata,j),MOV_FOURCC('z','l','i','b')); 2006 // } 2007 if( //trak->media_handler==MOV_FOURCC('s','p','r','t') && 2008 trak->stdata_len>=16 && 2009 char2int(trak->stdata,12)==MOV_FOURCC('z','l','i','b') 2010 ){ 2011 int newlen=stream_read_dword(demuxer->stream); 2012 #ifdef HAVE_ZLIB 2013 // unzip: 2014 z_stream zstrm; 2015 int zret; 2016 char buf2[newlen]; 2017 2018 len-=4; 2019 stream_read(demuxer->stream, buf, len); 2020 2021 zstrm.zalloc = (alloc_func)0; 2022 zstrm.zfree = (free_func)0; 2023 zstrm.opaque = (voidpf)0; 2024 zstrm.next_in = buf; 2025 zstrm.avail_in = len; 2026 zstrm.next_out = buf2; 2027 zstrm.avail_out = newlen; 2028 2029 zret = inflateInit(&zstrm); 2030 zret = inflate(&zstrm, Z_NO_FLUSH); 2031 if(newlen != zstrm.total_out) 2032 dprintf( "Warning! unzipped frame size differs hdr: %d zlib: %ld\n",newlen,zstrm.total_out); 2033 2034 write(fd, buf2, newlen); 2035 } else { 2036 #else 2037 len-=4; 2038 dprintf( "******* ZLIB COMPRESSED SAMPLE!!!!! (%d->%d bytes) *******\n",len,newlen); 2039 } 1306 2040 { 1307 char buf[trak->samples[i].size]; 1308 stream_seek(demuxer->stream, trak->samples[i].pos); 1309 snprintf((char *)&name[0], 20, "samp%d", i); 1310 fd = open((char *)&name[0], O_CREAT|O_WRONLY); 1311 stream_read(demuxer->stream, &buf[0], trak->samples[i].size); 1312 write(fd, &buf[0], trak->samples[i].size); 1313 close(fd); 2041 #endif 2042 stream_read(demuxer->stream, buf, len); 2043 write(fd, buf, len); 1314 2044 } 1315 for (i=0; i<trak->chunks_size; i++) 1316 { 1317 char buf[trak->length]; 1318 stream_seek(demuxer->stream, trak->chunks[i].pos); 1319 snprintf((char *)&name[0], 20, "chunk%d", i); 1320 fd = open((char *)&name[0], O_CREAT|O_WRONLY); 1321 stream_read(demuxer->stream, &buf[0], trak->length); 1322 write(fd, &buf[0], trak->length); 1323 close(fd); 1324 } 1325 if (trak->samplesize > 0) 1326 { 1327 char *buf; 1328 1329 buf = malloc(trak->samplesize); 1330 stream_seek(demuxer->stream, trak->chunks[0].pos); 1331 snprintf((char *)&name[0], 20, "trak%d", trak->id); 1332 fd = open((char *)&name[0], O_CREAT|O_WRONLY); 1333 stream_read(demuxer->stream, buf, trak->samplesize); 1334 write(fd, buf, trak->samplesize); 1335 close(fd); 1336 } 1337 stream_seek(demuxer->stream, pos); 2045 close(fd); 1338 2046 } 2047 } 2048 } 2049 } 2050 demuxer->stream->eof = 0; 1339 2051 #endif 1340 break; 1341 default: 1342 dprintf( "Unknown track type found (type: %d)\n", trak->type); 1343 break; 2052 return demuxer; 2053 } 2054 2055 /** 2056 * \brief return the mov track that belongs to a demuxer stream 2057 * \param ds the demuxer stream, may be NULL 2058 * \return the mov track info structure belonging to the stream, 2059 * NULL if not found 2060 */ 2061 static mov_track_t *stream_track(mov_priv_t *priv, demux_stream_t *ds) { 2062 if (ds && (ds->id >= 0) && (ds->id < priv->track_db)) 2063 return priv->tracks[ds->id]; 2064 return NULL; 2065 } 2066 2067 // return value: 2068 // 0 = EOF or no stream found 2069 // 1 = successfully read a packet 2070 static int demux_mov_fill_buffer(demuxer_t *demuxer,demux_stream_t* ds){ 2071 mov_priv_t* priv=demuxer->priv; 2072 mov_track_t* trak=NULL; 2073 float pts; 2074 int x; 2075 off_t pos; 2076 2077 if (ds->eof) return 0; 2078 trak = stream_track(priv, ds); 2079 if (!trak) return 0; 2080 2081 if(trak->samplesize){ 2082 // read chunk: 2083 if(trak->pos>=trak->chunks_size) return 0; // EOF 2084 stream_seek(demuxer->stream,trak->chunks[trak->pos].pos); 2085 pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale; 2086 if(trak->samplesize!=1) 2087 { 2088 dprintf( "WARNING! Samplesize(%d) != 1\n", 2089 trak->samplesize); 2090 if((trak->fourcc != MOV_FOURCC('t','w','o','s')) && (trak->fourcc != MOV_FOURCC('s','o','w','t'))) 2091 x=trak->chunks[trak->pos].size*trak->samplesize; 2092 else 2093 x=trak->chunks[trak->pos].size; 2094 } 2095 x=trak->chunks[trak->pos].size; 2096 // printf("X = %d\n", x); 2097 /* the following stuff is audio related */ 2098 if (trak->type == MOV_TRAK_AUDIO){ 2099 if(trak->stdata_len>=44 && trak->stdata[9]>=1 && char2int(trak->stdata,28)>0){ 2100 // stsd version 1 - we have audio compression ratio info: 2101 x/=char2int(trak->stdata,28); // samples/packet 2102 // x*=char2int(trak->stdata,32); // bytes/packet 2103 x*=char2int(trak->stdata,36); // bytes/frame 2104 } else { 2105 if(ds->ss_div && ds->ss_mul){ 2106 // workaround for buggy files like 7up-high-traffic-areas.mov, 2107 // with missing stsd v1 header containing compression rate 2108 x/=ds->ss_div; x*=ds->ss_mul; // compression ratio fix ! HACK ! 2109 } else { 2110 x*=trak->nchannels; 2111 x*=trak->samplebytes; 2112 } 1344 2113 } 1345 dprintf( "--------------\n"); 1346 priv->track_db++; 1347 trak=NULL; 1348 break; 1349 } 1350 #ifndef HAVE_ZLIB 1351 case MOV_FOURCC('c','m','o','v'): { 1352 dprintf("MOV: got compressed header but have no zlib\n"); 1353 return; 1354 } 1355 #else 1356 case MOV_FOURCC('m','o','o','v'): 1357 case MOV_FOURCC('c','m','o','v'): { 1358 // dprintf(MSGTR_MOVcomprhdr); 1359 lschunks(demuxer,level+1,pos+len,NULL); 1360 break; 1361 } 1362 case MOV_FOURCC('d','c','o','m'): { 1363 // int temp=stream_read_dword(demuxer->stream); 1364 unsigned int algo=be2me_32(stream_read_dword(demuxer->stream)); 1365 dprintf( "Compressed header uses %.4s algo!\n",(char *)&algo); 1366 break; 1367 } 1368 case MOV_FOURCC('c','m','v','d'): { 1369 // int temp=stream_read_dword(demuxer->stream); 1370 unsigned int moov_sz=stream_read_dword(demuxer->stream); 1371 unsigned int cmov_sz=len-4; 1372 unsigned char* cmov_buf; 1373 unsigned char* moov_buf; 1374 int zret; 1375 z_stream zstrm; 1376 stream_t* backup; 1377 1378 if (moov_sz > 0xffffffff - 16) { 1379 dprintf("Invalid cmvd atom size %d\n", moov_sz); 1380 break; 2114 dprintf( "Audio sample %d bytes pts %5.3f\n",trak->chunks[trak->pos].size*trak->samplesize,pts); 2115 } /* MOV_TRAK_AUDIO */ 2116 pos=trak->chunks[trak->pos].pos; 2117 } else { 2118 int frame=trak->pos; 2119 // editlist support: 2120 if(trak->type == MOV_TRAK_VIDEO && trak->editlist_size>=1){ 2121 // find the right editlist entry: 2122 if(frame<trak->editlist[trak->editlist_pos].start_frame) 2123 trak->editlist_pos=0; 2124 while(trak->editlist_pos<trak->editlist_size-1 && 2125 frame>=trak->editlist[trak->editlist_pos+1].start_frame) 2126 ++trak->editlist_pos; 2127 if(frame>=trak->editlist[trak->editlist_pos].start_frame+ 2128 trak->editlist[trak->editlist_pos].frames) return 0; // EOF 2129 // calc real frame index: 2130 frame-=trak->editlist[trak->editlist_pos].start_frame; 2131 frame+=trak->editlist[trak->editlist_pos].start_sample; 2132 // calc pts: 2133 pts=(float)(trak->samples[frame].pts+ 2134 trak->editlist[trak->editlist_pos].pts_offset)/(float)trak->timescale; 2135 } else { 2136 if(frame>=trak->samples_size) return 0; // EOF 2137 pts=(float)trak->samples[frame].pts/(float)trak->timescale; 2138 } 2139 // read sample: 2140 stream_seek(demuxer->stream,trak->samples[frame].pos); 2141 x=trak->samples[frame].size; 2142 pos=trak->samples[frame].pos; 2143 } 2144 if(trak->pos==0 && trak->stream_header_len>0){ 2145 // we have to append the stream header... 2146 demux_packet_t* dp=new_demux_packet(x+trak->stream_header_len); 2147 memcpy(dp->buffer,trak->stream_header,trak->stream_header_len); 2148 stream_read(demuxer->stream,dp->buffer+trak->stream_header_len,x); 2149 free(trak->stream_header); 2150 trak->stream_header = NULL; 2151 trak->stream_header_len = 0; 2152 dp->pts=pts; 2153 dp->flags=0; 2154 dp->pos=pos; // FIXME? 2155 ds_add_packet(ds,dp); 2156 } else 2157 ds_read_packet(ds,demuxer->stream,x,pts,pos,0); 2158 2159 ++trak->pos; 2160 if (demuxer->sub->id >= 0) { 2161 int samplenr = 0; 2162 trak = priv->tracks[demuxer->sub->id]; 2163 while (samplenr < trak->samples_size) { 2164 double subpts = (double)trak->samples[samplenr].pts / (double)trak->timescale; 2165 if (subpts >= pts) break; 2166 samplenr++; 2167 } 2168 samplenr--; 2169 if (samplenr < 0) 2170 vo_sub = NULL; 2171 else if (samplenr != priv->current_sub) { 2172 sh_sub_t *sh = demuxer->sub->sh; 2173 off_t pos = trak->samples[samplenr].pos; 2174 int len = trak->samples[samplenr].size; 2175 double subpts = (double)trak->samples[samplenr].pts / (double)trak->timescale; 2176 stream_seek(demuxer->stream, pos); 2177 if (sh->type == 'v') 2178 ds_read_packet(demuxer->sub, demuxer->stream, len, subpts, pos, 0); 2179 else { 2180 int i; 2181 char *line = priv->subtext; 2182 stream_skip(demuxer->stream, 2); // size 2183 len -= 2; 2184 if (len < 0) len = 0; 2185 if (len > MOV_MAX_SUBLEN) len = MOV_MAX_SUBLEN; 2186 stream_read(demuxer->stream, priv->subtext, len); 2187 priv->subtext[len] = 0; 2188 priv->subs.lines = 1; 2189 priv->subs.text[0] = &priv->subtext; 2190 while ((line = strchr(line, '\n'))) { 2191 *line++ = 0; 2192 priv->subs.text[priv->subs.lines] = line; 2193 priv->subs.lines++; 2194 } 2195 vo_sub = &priv->subs; 1381 2196 } 1382 cmov_buf=malloc(cmov_sz); 1383 moov_buf=malloc(moov_sz+16); 1384 dprintf( "Compressed header size: %d / %d\n",cmov_sz,moov_sz); 1385 1386 stream_read(demuxer->stream,cmov_buf,cmov_sz); 1387 1388 zstrm.zalloc = (alloc_func)0; 1389 zstrm.zfree = (free_func)0; 1390 zstrm.opaque = (voidpf)0; 1391 zstrm.next_in = cmov_buf; 1392 zstrm.avail_in = cmov_sz; 1393 zstrm.next_out = moov_buf; 1394 zstrm.avail_out = moov_sz; 1395 1396 zret = inflateInit(&zstrm); 1397 if (zret != Z_OK) 1398 { dprintf( "QT cmov: inflateInit err %d\n",zret); 1399 return; 2197 priv->current_sub = samplenr; 2198 } 2199 vo_osd_changed (OSDTYPE_SUBTITLE); 2200 } 2201 2202 return 1; 2203 2204 } 2205 2206 static float mov_seek_track(mov_track_t* trak,float pts,int flags){ 2207 2208 // printf("MOV track seek called %5.3f \n",pts); 2209 if(flags&2) pts*=trak->length; else pts*=(float)trak->timescale; 2210 2211 if(trak->samplesize){ 2212 int sample=pts/trak->duration; 2213 // printf("MOV track seek - chunk: %d (pts: %5.3f dur=%d) \n",sample,pts,trak->duration); 2214 if(!(flags&1)) sample+=trak->chunks[trak->pos].sample; // relative 2215 trak->pos=0; 2216 while(trak->pos<trak->chunks_size && trak->chunks[trak->pos].sample<sample) ++trak->pos; 2217 if (trak->pos == trak->chunks_size) return -1; 2218 pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale; 2219 } else { 2220 unsigned int ipts; 2221 if(!(flags&1)) pts+=trak->samples[trak->pos].pts; 2222 if(pts<0) pts=0; 2223 ipts=pts; 2224 //printf("MOV track seek - sample: %d \n",ipts); 2225 for(trak->pos=0;trak->pos<trak->samples_size;++trak->pos){ 2226 if(trak->samples[trak->pos].pts>=ipts) break; // found it! 2227 } 2228 if (trak->pos == trak->samples_size) return -1; 2229 if(trak->keyframes_size){ 2230 // find nearest keyframe 2231 int i; 2232 for(i=0;i<trak->keyframes_size;i++){ 2233 if(trak->keyframes[i]>=trak->pos) break; 1400 2234 } 1401 zret = inflate(&zstrm, Z_NO_FLUSH); 1402 if ((zret != Z_OK) && (zret != Z_STREAM_END)) 1403 { dprintf( "QT cmov inflate: ERR %d\n",zret); 1404 return; 1405 } 1406 #if 0 1407 else { 1408 FILE *DecOut; 1409 DecOut = fopen("Out.bin", "w"); 1410 fwrite(moov_buf, 1, moov_sz, DecOut); 1411 fclose(DecOut); 1412 } 1413 #endif 1414 if(moov_sz != zstrm.total_out) 1415 dprintf( "Warning! moov size differs cmov: %d zlib: %ld\n",moov_sz,zstrm.total_out); 1416 zret = inflateEnd(&zstrm); 1417 1418 backup=demuxer->stream; 1419 demuxer->stream=new_memory_stream(moov_buf,moov_sz); 1420 stream_skip(demuxer->stream,8); 1421 lschunks(demuxer,level+1,moov_sz,NULL); // parse uncompr. 'moov' 1422 //free_stream(demuxer->stream); 1423 demuxer->stream=backup; 1424 free(cmov_buf); 1425 free(moov_buf); 1426 break; 1427 } 1428 #endif 1429 case MOV_FOURCC('u','d','t','a'): 1430 { 1431 unsigned int udta_id; 1432 off_t udta_len; 1433 off_t udta_size = len; 1434 1435 dprintf( "mov: user data record found\n"); 1436 dprintf( "Quicktime Clip Info:\n"); 1437 1438 while((len > 8) && (udta_size > 8)) 1439 { 1440 udta_len = stream_read_dword(demuxer->stream); 1441 udta_id = stream_read_dword(demuxer->stream); 1442 udta_size -= 8; 1443 dprintf( "udta_id: %.4s (len: %"PRId64")\n", (char *)&udta_id, (int64_t)udta_len); 1444 switch (udta_id) 1445 { 1446 case MOV_FOURCC(0xa9,'c','p','y'): 1447 case MOV_FOURCC(0xa9,'d','a','y'): 1448 case MOV_FOURCC(0xa9,'d','i','r'): 1449 /* 0xa9,'e','d','1' - '9' : edit timestamps */ 1450 case MOV_FOURCC(0xa9,'f','m','t'): 1451 case MOV_FOURCC(0xa9,'i','n','f'): 1452 case MOV_FOURCC(0xa9,'p','r','d'): 1453 case MOV_FOURCC(0xa9,'p','r','f'): 1454 case MOV_FOURCC(0xa9,'r','e','q'): 1455 case MOV_FOURCC(0xa9,'s','r','c'): 1456 case MOV_FOURCC('n','a','m','e'): 1457 case MOV_FOURCC(0xa9,'n','a','m'): 1458 case MOV_FOURCC(0xa9,'A','R','T'): 1459 case MOV_FOURCC(0xa9,'c','m','t'): 1460 case MOV_FOURCC(0xa9,'a','u','t'): 1461 case MOV_FOURCC(0xa9,'s','w','r'): 1462 { 1463 off_t text_len = stream_read_word(demuxer->stream); 1464 char text[text_len+2+1]; 1465 stream_read(demuxer->stream, (char *)&text, text_len+2); 1466 text[text_len+2] = 0x0; 1467 switch(udta_id) 1468 { 1469 case MOV_FOURCC(0xa9,'a','u','t'): 1470 demux_info_add(demuxer, "author", &text[2]); 1471 dprintf( " Author: %s\n", &text[2]); 1472 break; 1473 case MOV_FOURCC(0xa9,'c','p','y'): 1474 demux_info_add(demuxer, "copyright", &text[2]); 1475 dprintf( " Copyright: %s\n", &text[2]); 1476 break; 1477 case MOV_FOURCC(0xa9,'i','n','f'): 1478 dprintf( " Info: %s\n", &text[2]); 1479 break; 1480 case MOV_FOURCC('n','a','m','e'): 1481 case MOV_FOURCC(0xa9,'n','a','m'): 1482 demux_info_add(demuxer, "name", &text[2]); 1483 dprintf( " Name: %s\n", &text[2]); 1484 break; 1485 case MOV_FOURCC(0xa9,'A','R','T'): 1486 dprintf( " Artist: %s\n", &text[2]); 1487 break; 1488 case MOV_FOURCC(0xa9,'d','i','r'): 1489 dprintf( " Director: %s\n", &text[2]); 1490 break; 1491 case MOV_FOURCC(0xa9,'c','m','t'): 1492 demux_info_add(demuxer, "comments", &text[2]); 1493 dprintf( " Comment: %s\n", &text[2]); 1494 break; 1495 case MOV_FOURCC(0xa9,'r','e','q'): 1496 dprintf( " Requirements: %s\n", &text[2]); 1497 break; 1498 case MOV_FOURCC(0xa9,'s','w','r'): 1499 demux_info_add(demuxer, "encoder", &text[2]); 1500 dprintf( " Software: %s\n", &text[2]); 1501 break; 1502 case MOV_FOURCC(0xa9,'d','a','y'): 1503 dprintf( " Creation timestamp: %s\n", &text[2]); 1504 break; 1505 case MOV_FOURCC(0xa9,'f','m','t'): 1506 dprintf( " Format: %s\n", &text[2]); 1507 break; 1508 case MOV_FOURCC(0xa9,'p','r','d'): 1509 dprintf( " Producer: %s\n", &text[2]); 1510 break; 1511 case MOV_FOURCC(0xa9,'p','r','f'): 1512 dprintf( " Performer(s): %s\n", &text[2]); 1513 break; 1514 case MOV_FOURCC(0xa9,'s','r','c'): 1515 dprintf( " Source providers: %s\n", &text[2]); 1516 break; 1517 } 1518 udta_size -= 4+text_len; 1519 break; 1520 } 1521 /* some other shits: WLOC - window location, 1522 LOOP - looping style, 1523 SelO - play only selected frames 1524 AllF - play all frames 1525 */ 1526 case MOV_FOURCC('W','L','O','C'): 1527 case MOV_FOURCC('L','O','O','P'): 1528 case MOV_FOURCC('S','e','l','O'): 1529 case MOV_FOURCC('A','l','l','F'): 1530 default: 1531 { 1532 if( udta_len>udta_size) 1533 udta_len=udta_size; 1534 { 1535 char dump[udta_len-4]; 1536 stream_read(demuxer->stream, (char *)&dump, udta_len-4-4); 1537 udta_size -= udta_len; 1538 } 1539 } 1540 } 1541 } 1542 break; 1543 } /* eof udta */ 1544 default: 1545 id = be2me_32(id); 1546 dprintf("MOV: unknown chunk: %.4s %d\n",(char *)&id,(int)len); 1547 } /* endof switch */ 1548 } /* endof else */ 1549 1550 pos+=len+8; 1551 if(pos>=endpos) break; 1552 if(!stream_seek(demuxer->stream,pos)) break; 2235 if (i == trak->keyframes_size) return -1; 2236 if(i>0 && (trak->keyframes[i]-trak->pos) > (trak->pos-trak->keyframes[i-1])) 2237 --i; 2238 trak->pos=trak->keyframes[i]; 2239 // printf("nearest keyframe: %d \n",trak->pos); 2240 } 2241 pts=(float)trak->samples[trak->pos].pts/(float)trak->timescale; 2242 } 2243 2244 // printf("MOV track seek done: %5.3f \n",pts); 2245 2246 return pts; 1553 2247 } 1554 } 1555 1556 static int lschunks_intrak(demuxer_t* demuxer, int level, unsigned int id, 1557 off_t pos, off_t len, mov_track_t* trak) 1558 { 1559 switch(id) { 1560 case MOV_FOURCC('m','d','a','t'): { 1561 dprintf("Hmm, strange MOV, parsing mdat in lschunks?\n"); 1562 return -1; 2248 2249 static void demux_seek_mov(demuxer_t *demuxer,float pts,int flags){ 2250 mov_priv_t* priv=demuxer->priv; 2251 demux_stream_t* ds; 2252 mov_track_t* trak; 2253 2254 // printf("MOV seek called %5.3f flag=%d \n",pts,flags); 2255 2256 ds=demuxer->video; 2257 trak = stream_track(priv, ds); 2258 if (trak) { 2259 //if(flags&2) pts*=(float)trak->length/(float)trak->timescale; 2260 //if(!(flags&1)) pts+=ds->pts; 2261 ds->pts=mov_seek_track(trak,pts,flags); 2262 if (ds->pts < 0) ds->eof = 1; 2263 else pts = ds->pts; 2264 flags=1; // absolute seconds 2265 } 2266 2267 ds=demuxer->audio; 2268 trak = stream_track(priv, ds); 2269 if (trak) { 2270 //if(flags&2) pts*=(float)trak->length/(float)trak->timescale; 2271 //if(!(flags&1)) pts+=ds->pts; 2272 ds->pts=mov_seek_track(trak,pts,flags); 2273 if (ds->pts < 0) ds->eof = 1; 2274 if (demuxer->video->id < 0) 2275 ((sh_audio_t*)ds->sh)->delay = ds->pts; 2276 } 2277 1563 2278 } 1564 case MOV_FOURCC('f','r','e','e'): 1565 case MOV_FOURCC('u','d','t','a'): 1566 /* here not supported :p */ 1567 break; 1568 case MOV_FOURCC('t','k','h','d'): { 1569 dprintf("MOV: %*sTrack header!\n", level, ""); 1570 // read codec data 1571 trak->tkdata_len = len; 1572 trak->tkdata = malloc(trak->tkdata_len); 1573 stream_read(demuxer->stream, trak->tkdata, trak->tkdata_len); 1574 /* 1575 0 1 Version 1576 1 3 Flags 1577 4 4 Creation time 1578 8 4 Modification time 1579 12 4 Track ID 1580 16 4 Reserved 1581 20 4 Duration 1582 24 8 Reserved 1583 32 2 Layer 1584 34 2 Alternate group 1585 36 2 Volume 1586 38 2 Reserved 1587 40 36 Matrix structure 1588 76 4 Track width 1589 80 4 Track height 1590 */ 1591 dprintf( 1592 "tkhd len=%d ver=%d flags=0x%X id=%d dur=%d lay=%d vol=%d\n", 1593 trak->tkdata_len, trak->tkdata[0], trak->tkdata[1], 1594 char2int(trak->tkdata, 12), // id 1595 char2int(trak->tkdata, 20), // duration 1596 char2short(trak->tkdata, 32), // layer 1597 char2short(trak->tkdata, 36)); // volume 1598 break; 2279 2280 static int demux_mov_control(demuxer_t *demuxer, int cmd, void *arg){ 2281 mov_track_t* track; 2282 2283 // try the video track 2284 track = stream_track(demuxer->priv, demuxer->video); 2285 if (!track || !track->length) 2286 // otherwise try to get the info from the audio track 2287 track = stream_track(demuxer->priv, demuxer->audio); 2288 2289 if (!track || !track->length) 2290 return DEMUXER_CTRL_DONTKNOW; 2291 2292 switch(cmd) { 2293 case DEMUXER_CTRL_GET_TIME_LENGTH: 2294 if (!track->timescale) 2295 return DEMUXER_CTRL_DONTKNOW; 2296 *((double *)arg) = (double)track->length / track->timescale; 2297 return DEMUXER_CTRL_OK; 2298 2299 case DEMUXER_CTRL_GET_PERCENT_POS: 2300 { 2301 off_t pos = track->pos; 2302 if (track->durmap_size >= 1) 2303 pos *= track->durmap[0].dur; 2304 *((int *)arg) = (int)(100 * pos / track->length); 2305 return DEMUXER_CTRL_OK; 2306 } 2307 } 2308 return DEMUXER_CTRL_NOTIMPL; 1599 2309 } 1600 case MOV_FOURCC('m','d','h','d'): { 1601 dprintf( "MOV: %*sMedia header!\n", level, ""); 1602 int version = stream_read_char(demuxer->stream); 1603 stream_skip(demuxer->stream, (version == 1) ? 19 : 11); 1604 // read timescale 1605 trak->timescale = stream_read_dword(demuxer->stream); 1606 // read length 1607 if (version == 1) 1608 trak->length = stream_read_qword(demuxer->stream); 1609 else 1610 trak->length = stream_read_dword(demuxer->stream); 1611 break; 1612 } 1613 case MOV_FOURCC('h','d','l','r'): { 1614 unsigned int tmp = stream_read_dword(demuxer->stream); 1615 unsigned int type = stream_read_dword_le(demuxer->stream); 1616 unsigned int subtype = stream_read_dword_le(demuxer->stream); 1617 unsigned int manufact = stream_read_dword_le(demuxer->stream); 1618 unsigned int comp_flags = stream_read_dword(demuxer->stream); 1619 unsigned int comp_mask = stream_read_dword(demuxer->stream); 1620 int len = stream_read_char(demuxer->stream); 1621 char* str = malloc(len + 1); 1622 stream_read(demuxer->stream, str, len); 1623 str[len] = 0; 1624 dprintf( 1625 "MOV: %*sHandler header: %.4s/%.4s (%.4s) %s\n", level, "", 1626 (char *)&type, (char *)&subtype, (char *)&manufact, str); 1627 free(str); 1628 switch(bswap_32(type)) { 1629 case MOV_FOURCC('m','h','l','r'): 1630 trak->media_handler = bswap_32(subtype); 1631 break; 1632 case MOV_FOURCC('d','h','l','r'): 1633 trak->data_handler = bswap_32(subtype); 1634 break; 1635 default: 1636 dprintf( 1637 "MOV: unknown handler class: 0x%X (%.4s)\n", 1638 bswap_32(type), (char *)&type); 1639 } 1640 break; 1641 } 1642 case MOV_FOURCC('v','m','h','d'): { 1643 dprintf( "MOV: %*sVideo header!\n", level, ""); 1644 trak->type = MOV_TRAK_VIDEO; 1645 // read video data 1646 break; 1647 } 1648 case MOV_FOURCC('s','m','h','d'): { 1649 dprintf( "MOV: %*sSound header!\n", level, ""); 1650 trak->type = MOV_TRAK_AUDIO; 1651 // read audio data 1652 break; 1653 } 1654 case MOV_FOURCC('g','m','h','d'): { 1655 dprintf( "MOV: %*sGeneric header!\n", level, ""); 1656 trak->type = MOV_TRAK_GENERIC; 1657 break; 1658 } 1659 case MOV_FOURCC('n','m','h','d'): { 1660 dprintf( "MOV: %*sGeneric header!\n", level, ""); 1661 trak->type = MOV_TRAK_GENERIC; 1662 break; 1663 } 1664 case MOV_FOURCC('s','t','s','d'): { 1665 int i = stream_read_dword(demuxer->stream); // temp! 1666 int count = stream_read_dword(demuxer->stream); 1667 dprintf( "MOV: %*sDescription list! (cnt:%d)\n", 1668 level, "", count); 1669 for (i = 0; i < count; i++) { 1670 off_t pos = stream_tell(demuxer->stream); 1671 off_t len = stream_read_dword(demuxer->stream); 1672 unsigned int fourcc = stream_read_dword_le(demuxer->stream); 1673 /* some files created with Broadcast 2000 (e.g. ilacetest.mov) 1674 contain raw I420 video but have a yv12 fourcc */ 1675 if (fourcc == mmioFOURCC('y','v','1','2')) 1676 fourcc = mmioFOURCC('I','4','2','0'); 1677 if (len < 8) 1678 break; // error 1679 dprintf( 1680 "MOV: %*s desc #%d: %.4s (%"PRId64" bytes)\n", level, "", 1681 i, (char *)&fourcc, (int64_t)len - 16); 1682 if (fourcc != trak->fourcc && i) 1683 dprintf("MOW: warning - different fourcc\n"); 1684 // if(!i) 1685 { 1686 trak->fourcc = fourcc; 1687 // read type specific (audio/video/time/text etc) header 1688 // NOTE: trak type is not yet known at this point :((( 1689 trak->stdata_len = len - 8; 1690 trak->stdata = malloc(trak->stdata_len); 1691 stream_read(demuxer->stream, trak->stdata, trak->stdata_len); 1692 } 1693 if (!stream_seek(demuxer->stream, pos + len)) 1694 break; 1695 } 1696 break; 1697 } 1698 case MOV_FOURCC('s','t','t','s'): { 1699 int temp = stream_read_dword(demuxer->stream); 1700 int len = stream_read_dword(demuxer->stream); 1701 int i; 1702 unsigned int pts = 0; 1703 dprintf( 1704 "MOV: %*sSample duration table! (%d blocks)\n", level, "", 1705 len); 1706 trak->durmap = calloc(len, sizeof(mov_durmap_t)); 1707 trak->durmap_size = len; 1708 for (i = 0; i < len; i++) { 1709 trak->durmap[i].num = stream_read_dword(demuxer->stream); 1710 trak->durmap[i].dur = stream_read_dword(demuxer->stream); 1711 pts += trak->durmap[i].num * trak->durmap[i].dur; 1712 } 1713 if (trak->length != pts) 1714 dprintf( "Warning! pts=%d length=%d\n", 1715 pts, trak->length); 1716 break; 1717 } 1718 case MOV_FOURCC('s','t','s','c'): { 1719 int temp = stream_read_dword(demuxer->stream); 1720 int len = stream_read_dword(demuxer->stream); 1721 int ver = (temp << 24); 1722 int flags = (temp << 16) | (temp << 8) | temp; 1723 int i; 1724 dprintf( 1725 "MOV: %*sSample->Chunk mapping table! (%d blocks) (ver:%d,flags:%d)\n", level, "", 1726 len, ver, flags); 1727 // read data: 1728 trak->chunkmap_size = len; 1729 trak->chunkmap = calloc(len, sizeof(mov_chunkmap_t)); 1730 for (i = 0; i < len; i++) { 1731 trak->chunkmap[i].first = stream_read_dword(demuxer->stream) - 1; 1732 trak->chunkmap[i].spc = stream_read_dword(demuxer->stream); 1733 trak->chunkmap[i].sdid = stream_read_dword(demuxer->stream); 1734 } 1735 break; 1736 } 1737 case MOV_FOURCC('s','t','s','z'): { 1738 int temp = stream_read_dword(demuxer->stream); 1739 int ss=stream_read_dword(demuxer->stream); 1740 int ver = (temp << 24); 1741 int flags = (temp << 16) | (temp << 8) | temp; 1742 int entries = stream_read_dword(demuxer->stream); 1743 int i; 1744 dprintf( 1745 "MOV: %*sSample size table! (entries=%d ss=%d) (ver:%d,flags:%d)\n", level, "", 1746 entries, ss, ver, flags); 1747 trak->samplesize = ss; 1748 if (!ss) { 1749 // variable samplesize 1750 trak->samples = realloc_struct(trak->samples, entries, sizeof(mov_sample_t)); 1751 trak->samples_size = entries; 1752 for (i = 0; i < entries; i++) 1753 trak->samples[i].size = stream_read_dword(demuxer->stream); 1754 } 1755 break; 1756 } 1757 case MOV_FOURCC('s','t','c','o'): { 1758 int temp = stream_read_dword(demuxer->stream); 1759 int len = stream_read_dword(demuxer->stream); 1760 int i; 1761 dprintf( 1762 "MOV: %*sChunk offset table! (%d chunks)\n", level, "", 1763 len); 1764 // extend array if needed: 1765 if (len > trak->chunks_size) { 1766 trak->chunks = realloc_struct(trak->chunks, len, sizeof(mov_chunk_t)); 1767 trak->chunks_size = len; 1768 } 1769 // read elements: 1770 for(i = 0; i < len; i++) 1771 trak->chunks[i].pos = stream_read_dword(demuxer->stream); 1772 break; 1773 } 1774 case MOV_FOURCC('c','o','6','4'): { 1775 int temp = stream_read_dword(demuxer->stream); 1776 int len = stream_read_dword(demuxer->stream); 1777 int i; 1778 dprintf( 1779 "MOV: %*s64bit chunk offset table! (%d chunks)\n", level, "", 1780 len); 1781 // extend array if needed: 1782 if (len > trak->chunks_size) { 1783 trak->chunks = realloc_struct(trak->chunks, len, sizeof(mov_chunk_t)); 1784 trak->chunks_size = len; 1785 } 1786 // read elements: 1787 for (i = 0; i < len; i++) { 1788 #ifndef _LARGEFILE_SOURCE 1789 if (stream_read_dword(demuxer->stream) != 0) 1790 dprintf( "Chunk %d has got 64bit address, but you've MPlayer compiled without LARGEFILE support!\n", i); 1791 trak->chunks[i].pos = stream_read_dword(demuxer->stream); 1792 #else 1793 trak->chunks[i].pos = stream_read_qword(demuxer->stream); 1794 #endif 1795 } 1796 break; 1797 } 1798 case MOV_FOURCC('s','t','s','s'): { 1799 int temp = stream_read_dword(demuxer->stream); 1800 int entries = stream_read_dword(demuxer->stream); 1801 int ver = (temp << 24); 1802 int flags = (temp << 16) | (temp<<8) | temp; 1803 int i; 1804 dprintf( 1805 "MOV: %*sSyncing samples (keyframes) table! (%d entries) (ver:%d,flags:%d)\n", level, "", 1806 entries, ver, flags); 1807 trak->keyframes_size = entries; 1808 trak->keyframes = calloc(entries, sizeof(unsigned int)); 1809 for (i = 0; i < entries; i++) 1810 trak->keyframes[i] = stream_read_dword(demuxer->stream) - 1; 1811 break; 1812 } 1813 case MOV_FOURCC('m','d','i','a'): { 1814 dprintf( "MOV: %*sMedia stream!\n", level, ""); 1815 lschunks(demuxer, level + 1, pos + len, trak); 1816 break; 1817 } 1818 case MOV_FOURCC('m','i','n','f'): { 1819 dprintf( "MOV: %*sMedia info!\n", level, ""); 1820 lschunks(demuxer, level + 1 ,pos + len, trak); 1821 break; 1822 } 1823 case MOV_FOURCC('s','t','b','l'): { 1824 dprintf( "MOV: %*sSample info!\n", level, ""); 1825 lschunks(demuxer, level + 1, pos + len, trak); 1826 break; 1827 } 1828 case MOV_FOURCC('e','d','t','s'): { 1829 dprintf( "MOV: %*sEdit atom!\n", level, ""); 1830 lschunks(demuxer, level + 1, pos + len, trak); 1831 break; 1832 } 1833 case MOV_FOURCC('e','l','s','t'): { 1834 int temp = stream_read_dword(demuxer->stream); 1835 int entries = stream_read_dword(demuxer->stream); 1836 int ver = (temp << 24); 1837 int flags = (temp << 16) | (temp << 8) | temp; 1838 int i; 1839 dprintf( 1840 "MOV: %*sEdit list table (%d entries) (ver:%d,flags:%d)\n", level, "", 1841 entries, ver, flags); 1842 #if 1 1843 trak->editlist_size = entries; 1844 trak->editlist = calloc(trak->editlist_size, sizeof(mov_editlist_t)); 1845 for (i = 0; i < entries; i++) { 1846 int dur = stream_read_dword(demuxer->stream); 1847 int mt = stream_read_dword(demuxer->stream); 1848 int mr = stream_read_dword(demuxer->stream); // 16.16fp 1849 trak->editlist[i].dur = dur; 1850 trak->editlist[i].pos = mt; 1851 trak->editlist[i].speed = mr; 1852 dprintf( 1853 "MOV: %*s entry#%d: duration: %d start time: %d speed: %3.1fx\n", level, "", 1854 i, dur, mt, (float)mr/65536.0f); 1855 } 1856 #endif 1857 break; 1858 } 1859 case MOV_FOURCC('c','o','d','e'): { 1860 /* XXX: Implement atom 'code' for FLASH support */ 1861 break; 1862 } 1863 default: 1864 id = be2me_32(id); 1865 dprintf("MOV: unknown chunk: %.4s %d\n",(char *)&id,(int)len); 1866 break; 1867 }//switch(id) 1868 return 0; 1869 } 1870 1871 static demuxer_t* mov_read_header(demuxer_t* demuxer){ 1872 mov_priv_t* priv=demuxer->priv; 1873 int t_no; 1874 int best_a_id=-1, best_a_len=0; 1875 int best_v_id=-1, best_v_len=0; 1876 1877 dprintf( "mov_read_header!\n"); 1878 1879 // Parse header: 1880 stream_reset(demuxer->stream); 1881 if(!stream_seek(demuxer->stream,priv->moov_start)) 1882 { 1883 dprintf("MOV: Cannot seek to the beginning of the Movie header (0x%"PRIx64")\n", 1884 (int64_t)priv->moov_start); 1885 return 0; 1886 } 1887 lschunks(demuxer, 0, priv->moov_end, NULL); 1888 // just in case we have hit eof while parsing... 1889 demuxer->stream->eof = 0; 1890 // dprintf( "--------------\n"); 1891 1892 // find the best (longest) streams: 1893 for(t_no=0;t_no<priv->track_db;t_no++){ 1894 mov_track_t* trak=priv->tracks[t_no]; 1895 int len=(trak->samplesize) ? trak->chunks_size : trak->samples_size; 1896 if(demuxer->a_streams[t_no]){ // need audio 1897 if(len>best_a_len){ best_a_len=len; best_a_id=t_no; } 1898 } 1899 if(demuxer->v_streams[t_no]){ // need video 1900 if(len>best_v_len){ best_v_len=len; best_v_id=t_no; } 1901 } 1902 } 1903 dprintf( "MOV: longest streams: A: #%d (%d samples) V: #%d (%d samples)\n", 1904 best_a_id,best_a_len,best_v_id,best_v_len); 1905 if(demuxer->audio->id==-1 && best_a_id>=0) demuxer->audio->id=best_a_id; 1906 if(demuxer->video->id==-1 && best_v_id>=0) demuxer->video->id=best_v_id; 1907 1908 // setup sh pointers: 1909 if(demuxer->audio->id>=0){ 1910 sh_audio_t* sh=demuxer->a_streams[demuxer->audio->id]; 1911 if(sh){ 1912 demuxer->audio->sh=sh; sh->ds=demuxer->audio; 1913 } else { 1914 dprintf( "MOV: selected audio stream (%d) does not exists\n",demuxer->audio->id); 1915 demuxer->audio->id=-2; 1916 } 1917 } 1918 if(demuxer->video->id>=0){ 1919 sh_video_t* sh=demuxer->v_streams[demuxer->video->id]; 1920 if(sh){ 1921 demuxer->video->sh=sh; sh->ds=demuxer->video; 1922 } else { 1923 dprintf( "MOV: selected video stream (%d) does not exists\n",demuxer->video->id); 1924 demuxer->video->id=-2; 1925 } 1926 } 1927 1928 if(demuxer->video->id<0 && demuxer->audio->id<0) { 1929 /* No AV streams found. Try to find an MPEG stream. */ 1930 for(t_no=0;t_no<priv->track_db;t_no++){ 1931 mov_track_t* trak=priv->tracks[t_no]; 1932 if(trak->media_handler == MOV_FOURCC('M','P','E','G')) { 1933 stream_t *s; 1934 demuxer_t *od; 1935 1936 demuxer->video->id = t_no; 1937 s = new_ds_stream(demuxer->video); 1938 od = demux_open(s, DEMUXER_TYPE_MPEG_PS, -1, -1, -1, NULL); 1939 if(od) return new_demuxers_demuxer(od, od, od); 1940 demuxer->video->id = -2; //new linked demuxer couldn't be allocated 1941 break; 1942 } 1943 } 1944 } 1945 1946 #if 0 1947 if( mp_msg_test(MSGL_DBG3) ){ 1948 for(t_no=0;t_no<priv->track_db;t_no++){ 1949 mov_track_t* trak=priv->tracks[t_no]; 1950 if(trak->type==MOV_TRAK_GENERIC){ 1951 int i; 1952 int fd; 1953 char name[20]; 1954 dprintf( "MOV: Track #%d: Extracting %d data chunks to files\n",t_no,trak->samples_size); 1955 for (i=0; i<trak->samples_size; i++) 1956 { 1957 int len=trak->samples[i].size; 1958 char buf[len]; 1959 stream_seek(demuxer->stream, trak->samples[i].pos); 1960 snprintf(name, 20, "t%02d-s%03d.%s", t_no,i, 1961 (trak->media_handler==MOV_FOURCC('f','l','s','h')) ? 1962 "swf":"dump"); 1963 fd = open(name, O_CREAT|O_WRONLY); 1964 // { int j; 1965 // for(j=0;j<trak->stdata_len-3; j++) 1966 // printf("stdata[%d]=0x%X ize=0x%X\n",j,char2int(trak->stdata,j),MOV_FOURCC('z','l','i','b')); 1967 // } 1968 if( //trak->media_handler==MOV_FOURCC('s','p','r','t') && 1969 trak->stdata_len>=16 && 1970 char2int(trak->stdata,12)==MOV_FOURCC('z','l','i','b') 1971 ){ 1972 int newlen=stream_read_dword(demuxer->stream); 1973 #ifdef HAVE_ZLIB 1974 // unzip: 1975 z_stream zstrm; 1976 int zret; 1977 char buf2[newlen]; 1978 1979 len-=4; 1980 stream_read(demuxer->stream, buf, len); 1981 1982 zstrm.zalloc = (alloc_func)0; 1983 zstrm.zfree = (free_func)0; 1984 zstrm.opaque = (voidpf)0; 1985 zstrm.next_in = buf; 1986 zstrm.avail_in = len; 1987 zstrm.next_out = buf2; 1988 zstrm.avail_out = newlen; 1989 1990 zret = inflateInit(&zstrm); 1991 zret = inflate(&zstrm, Z_NO_FLUSH); 1992 if(newlen != zstrm.total_out) 1993 dprintf( "Warning! unzipped frame size differs hdr: %d zlib: %ld\n",newlen,zstrm.total_out); 1994 1995 write(fd, buf2, newlen); 1996 } else { 1997 #else 1998 len-=4; 1999 dprintf( "******* ZLIB COMPRESSED SAMPLE!!!!! (%d->%d bytes) *******\n",len,newlen); 2000 } 2001 { 2002 #endif 2003 stream_read(demuxer->stream, buf, len); 2004 write(fd, buf, len); 2005 } 2006 close(fd); 2007 } 2008 } 2009 } 2010 } 2011 demuxer->stream->eof = 0; 2012 #endif 2013 2014 return demuxer; 2015 } 2016 2017 /** 2018 * \brief return the mov track that belongs to a demuxer stream 2019 * \param ds the demuxer stream, may be NULL 2020 * \return the mov track info structure belonging to the stream, 2021 * NULL if not found 2022 */ 2023 static mov_track_t *stream_track(mov_priv_t *priv, demux_stream_t *ds) { 2024 if (ds && (ds->id >= 0) && (ds->id < priv->track_db)) 2025 return priv->tracks[ds->id]; 2026 return NULL; 2027 } 2028 2029 // return value: 2030 // 0 = EOF or no stream found 2031 // 1 = successfully read a packet 2032 static int demux_mov_fill_buffer(demuxer_t *demuxer,demux_stream_t* ds){ 2033 mov_priv_t* priv=demuxer->priv; 2034 mov_track_t* trak=NULL; 2035 float pts; 2036 int x; 2037 off_t pos; 2038 2039 if (ds->eof) return 0; 2040 trak = stream_track(priv, ds); 2041 if (!trak) return 0; 2042 2043 if(trak->samplesize){ 2044 // read chunk: 2045 if(trak->pos>=trak->chunks_size) return 0; // EOF 2046 stream_seek(demuxer->stream,trak->chunks[trak->pos].pos); 2047 pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale; 2048 if(trak->samplesize!=1) 2049 { 2050 dprintf( "WARNING! Samplesize(%d) != 1\n", 2051 trak->samplesize); 2052 if((trak->fourcc != MOV_FOURCC('t','w','o','s')) && (trak->fourcc != MOV_FOURCC('s','o','w','t'))) 2053 x=trak->chunks[trak->pos].size*trak->samplesize; 2054 else 2055 x=trak->chunks[trak->pos].size; 2056 } 2057 x=trak->chunks[trak->pos].size; 2058 // printf("X = %d\n", x); 2059 /* the following stuff is audio related */ 2060 if (trak->type == MOV_TRAK_AUDIO){ 2061 if(trak->stdata_len>=44 && trak->stdata[9]>=1 && char2int(trak->stdata,28)>0){ 2062 // stsd version 1 - we have audio compression ratio info: 2063 x/=char2int(trak->stdata,28); // samples/packet 2064 // x*=char2int(trak->stdata,32); // bytes/packet 2065 x*=char2int(trak->stdata,36); // bytes/frame 2066 } else { 2067 if(ds->ss_div && ds->ss_mul){ 2068 // workaround for buggy files like 7up-high-traffic-areas.mov, 2069 // with missing stsd v1 header containing compression rate 2070 x/=ds->ss_div; x*=ds->ss_mul; // compression ratio fix ! HACK ! 2071 } else { 2072 x*=trak->nchannels; 2073 x*=trak->samplebytes; 2074 } 2075 } 2076 dprintf( "Audio sample %d bytes pts %5.3f\n",trak->chunks[trak->pos].size*trak->samplesize,pts); 2077 } /* MOV_TRAK_AUDIO */ 2078 pos=trak->chunks[trak->pos].pos; 2079 } else { 2080 int frame=trak->pos; 2081 // editlist support: 2082 if(trak->type == MOV_TRAK_VIDEO && trak->editlist_size>=1){ 2083 // find the right editlist entry: 2084 if(frame<trak->editlist[trak->editlist_pos].start_frame) 2085 trak->editlist_pos=0; 2086 while(trak->editlist_pos<trak->editlist_size-1 && 2087 frame>=trak->editlist[trak->editlist_pos+1].start_frame) 2088 ++trak->editlist_pos; 2089 if(frame>=trak->editlist[trak->editlist_pos].start_frame+ 2090 trak->editlist[trak->editlist_pos].frames) return 0; // EOF 2091 // calc real frame index: 2092 frame-=trak->editlist[trak->editlist_pos].start_frame; 2093 frame+=trak->editlist[trak->editlist_pos].start_sample; 2094 // calc pts: 2095 pts=(float)(trak->samples[frame].pts+ 2096 trak->editlist[trak->editlist_pos].pts_offset)/(float)trak->timescale; 2097 } else { 2098 if(frame>=trak->samples_size) return 0; // EOF 2099 pts=(float)trak->samples[frame].pts/(float)trak->timescale; 2100 } 2101 // read sample: 2102 stream_seek(demuxer->stream,trak->samples[frame].pos); 2103 x=trak->samples[frame].size; 2104 pos=trak->samples[frame].pos; 2105 } 2106 if(trak->pos==0 && trak->stream_header_len>0){ 2107 // we have to append the stream header... 2108 demux_packet_t* dp=new_demux_packet(x+trak->stream_header_len); 2109 memcpy(dp->buffer,trak->stream_header,trak->stream_header_len); 2110 stream_read(demuxer->stream,dp->buffer+trak->stream_header_len,x); 2111 free(trak->stream_header); 2112 trak->stream_header = NULL; 2113 trak->stream_header_len = 0; 2114 dp->pts=pts; 2115 dp->flags=0; 2116 dp->pos=pos; // FIXME? 2117 ds_add_packet(ds,dp); 2118 } else 2119 ds_read_packet(ds,demuxer->stream,x,pts,pos,0); 2120 2121 ++trak->pos; 2122 2123 return 1; 2124 2125 } 2126 2127 static float mov_seek_track(mov_track_t* trak,float pts,int flags){ 2128 2129 // printf("MOV track seek called %5.3f \n",pts); 2130 if(flags&2) pts*=trak->length; else pts*=(float)trak->timescale; 2131 2132 if(trak->samplesize){ 2133 int sample=pts/trak->duration; 2134 // printf("MOV track seek - chunk: %d (pts: %5.3f dur=%d) \n",sample,pts,trak->duration); 2135 if(!(flags&1)) sample+=trak->chunks[trak->pos].sample; // relative 2136 trak->pos=0; 2137 while(trak->pos<trak->chunks_size && trak->chunks[trak->pos].sample<sample) ++trak->pos; 2138 if (trak->pos == trak->chunks_size) return -1; 2139 pts=(float)(trak->chunks[trak->pos].sample*trak->duration)/(float)trak->timescale; 2140 } else { 2141 unsigned int ipts; 2142 if(!(flags&1)) pts+=trak->samples[trak->pos].pts; 2143 if(pts<0) pts=0; 2144 ipts=pts; 2145 //printf("MOV track seek - sample: %d \n",ipts); 2146 for(trak->pos=0;trak->pos<trak->samples_size;++trak->pos){ 2147 if(trak->samples[trak->pos].pts>=ipts) break; // found it! 2148 } 2149 if (trak->pos == trak->samples_size) return -1; 2150 if(trak->keyframes_size){ 2151 // find nearest keyframe 2152 int i; 2153 for(i=0;i<trak->keyframes_size;i++){ 2154 if(trak->keyframes[i]>=trak->pos) break; 2155 } 2156 if (i == trak->keyframes_size) return -1; 2157 if(i>0 && (trak->keyframes[i]-trak->pos) > (trak->pos-trak->keyframes[i-1])) 2158 --i; 2159 trak->pos=trak->keyframes[i]; 2160 // printf("nearest keyframe: %d \n",trak->pos); 2161 } 2162 pts=(float)trak->samples[trak->pos].pts/(float)trak->timescale; 2163 } 2164 2165 // printf("MOV track seek done: %5.3f \n",pts); 2166 2167 return pts; 2168 } 2169 2170 static void demux_seek_mov(demuxer_t *demuxer,float pts,int flags){ 2171 mov_priv_t* priv=demuxer->priv; 2172 demux_stream_t* ds; 2173 mov_track_t* trak; 2174 2175 // printf("MOV seek called %5.3f flag=%d \n",pts,flags); 2176 2177 ds=demuxer->video; 2178 trak = stream_track(priv, ds); 2179 if (trak) { 2180 //if(flags&2) pts*=(float)trak->length/(float)trak->timescale; 2181 //if(!(flags&1)) pts+=ds->pts; 2182 ds->pts=mov_seek_track(trak,pts,flags); 2183 if (ds->pts < 0) ds->eof = 1; 2184 else pts = ds->pts; 2185 flags=1; // absolute seconds 2186 } 2187 2188 ds=demuxer->audio; 2189 trak = stream_track(priv, ds); 2190 if (trak) { 2191 //if(flags&2) pts*=(float)trak->length/(float)trak->timescale; 2192 //if(!(flags&1)) pts+=ds->pts; 2193 ds->pts=mov_seek_track(trak,pts,flags); 2194 if (ds->pts < 0) ds->eof = 1; 2195 if (demuxer->video->id < 0) 2196 ((sh_audio_t*)ds->sh)->delay = ds->pts; 2197 } 2198 2199 } 2200 2201 static int demux_mov_control(demuxer_t *demuxer, int cmd, void *arg){ 2202 mov_track_t* track; 2203 2204 // try the video track 2205 track = stream_track(demuxer->priv, demuxer->video); 2206 if (!track || !track->length) 2207 // otherwise try to get the info from the audio track 2208 track = stream_track(demuxer->priv, demuxer->audio); 2209 2210 if (!track || !track->length) 2211 return DEMUXER_CTRL_DONTKNOW; 2212 2213 switch(cmd) { 2214 case DEMUXER_CTRL_GET_TIME_LENGTH: 2215 if (!track->timescale) 2216 return DEMUXER_CTRL_DONTKNOW; 2217 *((double *)arg) = (double)track->length / track->timescale; 2218 return DEMUXER_CTRL_OK; 2219 2220 case DEMUXER_CTRL_GET_PERCENT_POS: 2221 { 2222 off_t pos = track->pos; 2223 if (track->durmap_size >= 1) 2224 pos *= track->durmap[0].dur; 2225 *((int *)arg) = (int)(100 * pos / track->length); 2226 return DEMUXER_CTRL_OK; 2227 } 2228 } 2229 return DEMUXER_CTRL_NOTIMPL; 2230 } 2231 2232 2233 demuxer_desc_t demuxer_desc_mov = { 2234 "Quicktime/MP4 demuxer", 2235 "mov", 2236 "Quicktime/MOV", 2237 "Arpi, Al3x, Atmos, others", 2238 "Handles Quicktime, MP4, 3GP", 2239 DEMUXER_TYPE_MOV, 2240 0, // slow autodetect 2241 mov_check_file, 2242 demux_mov_fill_buffer, 2243 mov_read_header, 2244 demux_close_mov, 2245 demux_seek_mov, 2246 demux_mov_control 2247 }; 2310 2311 2312 demuxer_desc_t demuxer_desc_mov = { 2313 "Quicktime/MP4 demuxer", 2314 "mov", 2315 "Quicktime/MOV", 2316 "Arpi, Al3x, Atmos, others", 2317 "Handles Quicktime, MP4, 3GP", 2318 DEMUXER_TYPE_MOV, 2319 1, // slow autodetect 2320 mov_check_file, 2321 demux_mov_fill_buffer, 2322 mov_read_header, 2323 demux_close_mov, 2324 demux_seek_mov, 2325 demux_mov_control 2326 }; -
TabularUnified trunk/libmpdemux/demux_mpg.c ¶
r249 r263 305 305 if(!demux->s_streams[aid]){ 306 306 dprintf("Found subtitle: %d \n",aid); 307 demux->s_streams[aid]=1;307 new_sh_sub(demux, aid); 308 308 } 309 309 if(demux->sub->id > -1) -
TabularUnified trunk/libmpdemux/demux_ogg.c ¶
r260 r263 516 516 } 517 517 // check for -slang if subs are uninitialized yet 518 if (os->text && d->sub->id == -1&& demux_ogg_check_lang(val, dvdsub_lang))518 if (os->text && d->sub->id < 0 && demux_ogg_check_lang(val, dvdsub_lang)) 519 519 { 520 d->sub->id = i d;520 d->sub->id = index; 521 521 //dvdsub_id = index; 522 522 dprintf("Ogg demuxer: Displaying subtitle stream id %d which matched -slang %s\n", id, val); … … 568 568 } 569 569 if (os->text) { 570 if (id == d ->sub->id) // don't want to add subtitles to the demuxer for now570 if (id == demux_ogg_sub_id(d, d->sub->id)) // don't want to add subtitles to the demuxer for now 571 571 demux_ogg_add_sub(os,pack); 572 572 return 0; … … 748 748 /* defined in demux_mov.c */ 749 749 extern unsigned int store_ughvlc(unsigned char *s, unsigned int v); 750 751 /** \brief Return the number of subtitle tracks in the file.752 753 \param demuxer The demuxer for which the number of subtitle tracks754 should be returned.755 */756 int demux_ogg_num_subs(demuxer_t *demuxer) {757 ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)demuxer->priv;758 return ogg_d->n_text;759 }760 750 761 751 /** \brief Change the current subtitle stream and return its ID. … … 1215 1205 ogg_d->subs[ogg_d->num_sub].samplerate= get_uint64(&st->time_unit)/10; 1216 1206 ogg_d->subs[ogg_d->num_sub].text = 1; 1217 if (identify)1218 dprintf("ID_SUBTITLE_ID=%d\n", ogg_d->n_text);1219 1207 ogg_d->subs[ogg_d->num_sub].id = ogg_d->n_text; 1220 1208 if (demuxer->sub->id == ogg_d->n_text) 1221 1209 text_id = ogg_d->num_sub; 1222 1210 ogg_t_table[ogg_d->n_text] = s_no; 1211 new_sh_sub(demuxer, ogg_d->n_text); 1223 1212 ogg_d->n_text++; 1224 1213 ogg_d->text_ids = (int *)realloc(ogg_d->text_ids, sizeof(int) * ogg_d->n_text); -
TabularUnified trunk/libmpdemux/demux_rawaudio.c ¶
r64 r263 24 24 static int samplesize = 2; 25 25 static int format = 0x1; // Raw PCM 26 26 static int bitrate = 0; 27 27 28 28 … … 36 36 w->nChannels = sh_audio->channels = channels; 37 37 w->nSamplesPerSec = sh_audio->samplerate = samplerate; 38 w->nAvgBytesPerSec = samplerate*samplesize*channels; 38 if (bitrate > 999) 39 w->nAvgBytesPerSec = bitrate/8; 40 else if (bitrate > 0) 41 w->nAvgBytesPerSec = bitrate*125; 42 else 43 w->nAvgBytesPerSec = samplerate*samplesize*channels; 39 44 w->nBlockAlign = channels*samplesize; 40 45 sh_audio->samplesize = samplesize; … … 64 69 dp->pts = (spos - demuxer->movi_start) / (float)(sh_audio->wf->nAvgBytesPerSec); 65 70 dp->pos = (spos - demuxer->movi_start); 66 67 71 l = stream_read(demuxer->stream,dp->buffer,l); 68 72 resize_demux_packet(dp, l); -
TabularUnified trunk/libmpdemux/demux_real.c ¶
r262 r263 1529 1529 1530 1530 /* emulate BITMAPINFOHEADER */ 1531 sh->bih = malloc(sizeof(BITMAPINFOHEADERw) +16);1532 memset(sh->bih, 0, sizeof(BITMAPINFOHEADERw) +16);1533 sh->bih->biSize = 48;1531 sh->bih = malloc(sizeof(BITMAPINFOHEADERw)); 1532 memset(sh->bih, 0, sizeof(BITMAPINFOHEADERw)); 1533 sh->bih->biSize = sizeof(BITMAPINFOHEADERw); 1534 1534 sh->disp_w = sh->bih->biWidth = stream_read_word(demuxer->stream); 1535 1535 sh->disp_h = sh->bih->biHeight = stream_read_word(demuxer->stream); … … 1562 1562 stream_skip(demuxer->stream, 2); 1563 1563 1564 // read codec sub-format (to make difference between low and high rate codec)1565 ((unsigned int*)(sh->bih+1))[0]=stream_read_dword(demuxer->stream);1566 1567 /* h263 hack */1568 tmp = stream_read_dword(demuxer->stream);1569 ((unsigned int*)(sh->bih+1))[1]=tmp;1570 dprintf("H.263 ID: %x\n", tmp);1571 switch (tmp)1572 1564 { 1573 case 0x10000000: 1574 /* sub id: 0 */ 1575 /* codec id: rv10 */ 1576 break; 1577 case 0x10003000: 1578 case 0x10003001: 1579 /* sub id: 3 */ 1580 /* codec id: rv10 */ 1581 sh->bih->biCompression = sh->format = mmioFOURCC('R', 'V', '1', '3'); 1582 break; 1583 case 0x20001000: 1584 case 0x20100001: 1585 case 0x20200002: 1586 /* codec id: rv20 */ 1587 break; 1588 case 0x30202002: 1589 /* codec id: rv30 */ 1590 break; 1591 case 0x40000000: 1592 /* codec id: rv40 */ 1593 break; 1594 default: 1595 /* codec id: none */ 1596 dprintf("unknown id: %x\n", tmp); 1597 } 1598 if((sh->format<=0x30335652) && (tmp>=0x20200002)){ 1599 // read data for the cmsg24[] (see vd_realvid.c) 1565 // read and store codec extradata 1600 1566 unsigned int cnt = codec_data_size - (stream_tell(demuxer->stream) - codec_pos); 1601 if (cnt < 2) {1602 dprintf(" realvid: cmsg24 data too short (size%u)\n", cnt);1567 if (cnt > 0x7fffffff - sizeof(BITMAPINFOHEADERw)) { 1568 dprintf("Extradata too big (%u)\n", cnt); 1603 1569 } else { 1604 int ii; 1605 if (cnt > 8) { 1606 dprintf("realvid: cmsg24 data too big, please report (size %u)\n", cnt); 1607 cnt = 8; 1608 } 1609 for (ii = 0; ii < cnt; ii++) 1610 ((unsigned char*)(sh->bih+1))[8+ii]=(unsigned short)stream_read_char(demuxer->stream); 1570 sh->bih = realloc(sh->bih, sizeof(BITMAPINFOHEADERw) + cnt); 1611 1571 sh->bih->biSize += cnt; 1572 stream_read(demuxer->stream, ((unsigned char*)(sh->bih+1)), cnt); 1612 1573 } 1613 1574 } 1575 if(sh->format == 0x30315652 && ((unsigned char*)(sh->bih+1))[6] == 0x30) 1576 sh->bih->biCompression = sh->format = mmioFOURCC('R', 'V', '1', '3'); 1614 1577 /* Select video stream with highest bitrate if multirate file*/ 1615 1578 if (priv->is_multirate && ((demuxer->video->id == -1) || -
TabularUnified trunk/libmpdemux/demux_ts.c ¶
r260 r263 233 233 int keep_broken; 234 234 int last_aid; 235 int last_vid; 235 236 char packet[TS_FEC_PACKET_SIZE]; 236 237 TS_stream_info vstr, astr; … … 382 383 dprintf("GOOD CC: %d, BAD CC: %d\n", good, bad); 383 384 384 //if(good >= bad)385 return size;386 //else387 return 0;385 if(good >= bad) 386 return size; 387 else 388 return 0; 388 389 } 389 390 … … 934 935 ES_stream_t *es = priv->ts.pids[params.vpid]; 935 936 sh_video = new_sh_video_vid(demuxer, 0, es->pid); 937 priv->ts.streams[params.vpid].id = 0; 938 priv->ts.streams[params.vpid].sh = sh_video; 939 priv->ts.streams[params.vpid].type = TYPE_VIDEO; 940 priv->last_vid = 0; 941 demuxer->video->id = 0; 942 936 943 if(params.vtype == VIDEO_AVC && es->extradata && es->extradata_len) 937 944 { … … 2701 2708 } 2702 2709 2710 if((IS_VIDEO(tss->type) || IS_VIDEO(tss->subtype)) && is_start && !priv->ts.streams[pid].sh && priv->last_vid+1 < MAX_V_STREAMS) 2711 { 2712 sh_video_t *sh = new_sh_video_vid(demuxer, priv->last_vid+1, pid); 2713 if(sh) 2714 { 2715 sh->format = IS_VIDEO(tss->type) ? tss->type : tss->subtype; 2716 sh->ds = demuxer->video; 2717 2718 priv->last_vid++; 2719 priv->ts.streams[pid].id = priv->last_vid; 2720 priv->ts.streams[pid].sh = sh; 2721 priv->ts.streams[pid].type = TYPE_VIDEO; 2722 dprintf("\r\nADDED VIDEO PID %d, type: %x stream n. %d\r\n", pid, sh->format, priv->last_vid); 2723 } 2724 } 2703 2725 2704 2726 if((pid == demuxer->sub->id)) //or the lang is right … … 2707 2729 } 2708 2730 2709 if(is_video && (demuxer->video->id == tss->pid))2731 if(is_video && (demuxer->video->id == priv->ts.streams[pid].id)) 2710 2732 { 2711 2733 ds = demuxer->video; … … 3133 3155 } 3134 3156 3157 static int is_usable_program(ts_priv_t *priv, pmt_t *pmt) 3158 { 3159 int j; 3160 3161 for(j = 0; j < pmt->es_cnt; j++) 3162 { 3163 if(priv->ts.pids[pmt->es[j].pid] == NULL || priv->ts.streams[pmt->es[j].pid].sh == NULL) 3164 continue; 3165 if( 3166 priv->ts.streams[pmt->es[j].pid].type == TYPE_VIDEO || 3167 priv->ts.streams[pmt->es[j].pid].type == TYPE_AUDIO 3168 ) 3169 return 1; 3170 } 3171 3172 return 0; 3173 } 3174 3135 3175 static int demux_ts_control(demuxer_t *demuxer, int cmd, void *arg) 3136 3176 { … … 3140 3180 { 3141 3181 case DEMUXER_CTRL_SWITCH_AUDIO: 3142 {3143 sh_audio_t *sh_audio = demuxer->audio->sh;3144 sh_audio_t *sh_a= NULL;3182 case DEMUXER_CTRL_SWITCH_VIDEO: 3183 { 3184 void *sh = NULL; 3145 3185 int i, n; 3146 if(!sh_audio) 3147 return DEMUXER_CTRL_NOTIMPL; 3148 3186 int reftype, areset = 0, vreset = 0; 3187 demux_stream_t *ds; 3188 3189 if(cmd == DEMUXER_CTRL_SWITCH_VIDEO) 3190 { 3191 reftype = TYPE_VIDEO; 3192 ds = demuxer->video; 3193 vreset = 1; 3194 } 3195 else 3196 { 3197 reftype = TYPE_AUDIO; 3198 ds = demuxer->audio; 3199 areset = 1; 3200 } 3149 3201 n = *((int*)arg); 3202 if(n == -2) 3203 { 3204 reset_fifos(priv, areset, vreset, 0); 3205 ds->id = -2; 3206 ds->sh = NULL; 3207 ds_free_packs(ds); 3208 *((int*)arg) = ds->id; 3209 return DEMUXER_CTRL_OK; 3210 } 3211 3150 3212 if(n < 0) 3151 3213 { 3152 3214 for(i = 0; i < 8192; i++) 3153 3215 { 3154 if(priv->ts.streams[i].id == d emuxer->audio->id && priv->ts.streams[i].type == TYPE_AUDIO)3216 if(priv->ts.streams[i].id == ds->id && priv->ts.streams[i].type == reftype) 3155 3217 break; 3156 3218 } 3157 3219 3158 while(!sh _a)3220 while(!sh) 3159 3221 { 3160 3222 i = (i+1) % 8192; 3161 if(priv->ts.streams[i].id == demuxer->audio->id) //we made a complete loop 3162 break; 3163 if(priv->ts.streams[i].type == TYPE_AUDIO) 3164 sh_a = (sh_audio_t*)priv->ts.streams[i].sh; 3223 if(priv->ts.streams[i].type == reftype) 3224 { 3225 if(priv->ts.streams[i].id == ds->id) //we made a complete loop 3226 break; 3227 sh = priv->ts.streams[i].sh; 3228 } 3165 3229 } 3166 3230 } … … 3169 3233 for(i = 0; i < 8192; i++) 3170 3234 { 3171 if(priv->ts.streams[i].id == n && priv->ts.streams[i].type == TYPE_AUDIO)3235 if(priv->ts.streams[i].id == n && priv->ts.streams[i].type == reftype) 3172 3236 { 3173 sh _a = (sh_audio_t*)priv->ts.streams[i].sh;3237 sh = priv->ts.streams[i].sh; 3174 3238 break; 3175 3239 } … … 3177 3241 } 3178 3242 3179 if(sh_a) 3180 { 3181 demuxer->audio->id = priv->ts.streams[i].id; 3182 demuxer->audio->sh = sh_a; 3183 ds_free_packs(demuxer->audio); 3184 dprintf("\r\ndemux_ts, switched to audio pid %d, id: %d, sh: %p\r\n", i, demuxer->audio->id, sh_a); 3185 } 3186 3187 *((int*)arg) = demuxer->audio->id; 3243 if(sh) 3244 { 3245 if(ds->id != priv->ts.streams[i].id) 3246 reset_fifos(priv, areset, vreset, 0); 3247 ds->id = priv->ts.streams[i].id; 3248 ds->sh = sh; 3249 ds_free_packs(ds); 3250 dprintf("\r\ndemux_ts, switched to audio pid %d, id: %d, sh: %p\r\n", i, ds->id, sh); 3251 } 3252 3253 *((int*)arg) = ds->id; 3188 3254 return DEMUXER_CTRL_OK; 3189 3255 } 3190 3256 3257 case DEMUXER_CTRL_IDENTIFY_PROGRAM: //returns in prog->{aid,vid} the new ids that comprise a program 3258 { 3259 int i, j, cnt=0; 3260 int vid_done=0, aid_done=0; 3261 pmt_t *pmt = NULL; 3262 demux_program_t *prog = arg; 3263 3264 if(priv->pmt_cnt < 2) 3265 return DEMUXER_CTRL_NOTIMPL; 3266 3267 if(prog->progid == -1) 3268 { 3269 int cur_pmt_idx = 0; 3270 3271 for(i = 0; i < priv->pmt_cnt; i++) 3272 if(priv->pmt[i].progid == priv->prog) 3273 { 3274 cur_pmt_idx = i; 3275 break; 3276 } 3277 3278 i = (cur_pmt_idx + 1) % priv->pmt_cnt; 3279 while(i != cur_pmt_idx) 3280 { 3281 pmt = &priv->pmt[i]; 3282 cnt = is_usable_program(priv, pmt); 3283 if(cnt) 3284 break; 3285 i = (i + 1) % priv->pmt_cnt; 3286 } 3287 } 3288 else 3289 { 3290 for(i = 0; i < priv->pmt_cnt; i++) 3291 if(priv->pmt[i].progid == prog->progid) 3292 { 3293 pmt = &priv->pmt[i]; //required program 3294 cnt = is_usable_program(priv, pmt); 3295 } 3296 } 3297 3298 if(!cnt) 3299 return DEMUXER_CTRL_NOTIMPL; 3300 3301 //finally some food 3302 prog->aid = prog->vid = -2; //no audio and no video by default 3303 for(j = 0; j < pmt->es_cnt; j++) 3304 { 3305 if(priv->ts.pids[pmt->es[j].pid] == NULL || priv->ts.streams[pmt->es[j].pid].sh == NULL) 3306 continue; 3307 3308 if(!vid_done && priv->ts.streams[pmt->es[j].pid].type == TYPE_VIDEO) 3309 { 3310 vid_done = 1; 3311 prog->vid = priv->ts.streams[pmt->es[j].pid].id; 3312 } 3313 else if(!aid_done && priv->ts.streams[pmt->es[j].pid].type == TYPE_AUDIO) 3314 { 3315 aid_done = 1; 3316 prog->aid = priv->ts.streams[pmt->es[j].pid].id; 3317 } 3318 } 3319 3320 priv->prog = prog->progid = pmt->progid; 3321 return DEMUXER_CTRL_OK; 3322 } 3191 3323 3192 3324 default: -
TabularUnified trunk/libmpdemux/demuxer.c ¶
r262 r263 81 81 82 82 demuxer_desc_t* demuxer_list[] = { 83 &demuxer_desc_lavf, 83 84 &demuxer_desc_rawaudio, 84 85 // &demuxer_desc_rawvideo, … … 87 88 #endif 88 89 // &demuxer_desc_mf, 89 &demuxer_desc_avi,90 //&demuxer_desc_avi, 90 91 // &demuxer_desc_y4m, 91 92 &demuxer_desc_asf, … … 111 112 // &demuxer_desc_pva, 112 113 // &demuxer_desc_lmlm4, 113 &demuxer_desc_audio,114 114 &demuxer_desc_mpeg_ps, 115 115 &demuxer_desc_mpeg_pes, … … 118 118 &demuxer_desc_mpeg4_es, 119 119 &demuxer_desc_h264_es, 120 &demuxer_desc_mpeg_ts,120 //&demuxer_desc_mpeg_ts, 121 121 &demuxer_desc_mpeg_ty, 122 &demuxer_desc_audio, 122 123 #ifdef HAVE_LIBDV095 123 124 &demuxer_desc_rawdv, … … 129 130 &demuxer_desc_rtp, 130 131 #endif 131 &demuxer_desc_lavf,132 132 // &demuxer_desc_aac, 133 133 NULL … … 214 214 } 215 215 216 sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid) { 217 if (id > MAX_S_STREAMS - 1 || id < 0) { 218 dprintf("Requested sub stream id overflow (%d > %d)\n", 219 id, MAX_S_STREAMS); 220 return NULL; 221 } 222 if (demuxer->s_streams[id]) 223 dprintf("Sub stream %i redefined\n", id); 224 else { 225 sh_sub_t *sh = calloc(1, sizeof(sh_sub_t)); 226 demuxer->s_streams[id] = sh; 227 sh->sid = sid; 228 dprintf("ID_SUBTITLE_ID=%d\n", sid); 229 } 230 return demuxer->s_streams[id]; 231 } 232 216 233 sh_audio_t* new_sh_audio_aid(demuxer_t *demuxer,int id,int aid){ 217 234 if(id > MAX_A_STREAMS-1 || id < 0) … … 257 274 } 258 275 259 void free_sh_audio(sh_audio_t* sh){ 260 dprintf("DEMUXER: freeing sh_audio at %p \n",sh); 261 if(sh->wf) free(sh->wf); 262 free(sh); 263 sh=NULL; 276 void free_sh_audio(demuxer_t *demuxer, int id) { 277 sh_audio_t *sh = NULL; 278 if (!demuxer) 279 return; 280 sh = demuxer->a_streams[id]; 281 dprintf("DEMUXER: freeing sh_audio at %p. id: %i\n",sh, id); 282 if (sh) 283 { 284 if(sh->wf) free(sh->wf); 285 free(sh); 286 } 287 demuxer->a_streams[id] = NULL; 264 288 } 265 289 … … 284 308 // free streams: 285 309 for(i=0;i<MAX_A_STREAMS;i++) 286 if(demuxer->a_streams[i]) free_sh_audio(demuxer ->a_streams[i]);310 if(demuxer->a_streams[i]) free_sh_audio(demuxer, i); 287 311 for(i = 0; i < MAX_V_STREAMS; i++) 288 312 if(demuxer->v_streams[i]) free_sh_video(demuxer->v_streams[i]); … … 713 737 int pre_buf; 714 738 demuxer_desc_t *demuxer_desc; 715 int fformat ;739 int fformat = 0; 716 740 int i; 717 741 … … 906 930 } 907 931 #endif 908 file_format = DEMUXER_TYPE_LAVF; 932 //if (!file_format) 933 // file_format = DEMUXER_TYPE_LAVF; 909 934 // If somebody requested a demuxer check it 910 935 if (file_format) { … … 1081 1106 } 1082 1107 } 1108 if (file_format == DEMUXER_TYPE_RAWAUDIO) 1109 { 1110 demuxer_type = file_format; 1111 demuxer_force = 1; 1112 } 1083 1113 vd = demux_open_stream(vs, demuxer_type ? demuxer_type : file_format, 1084 1114 demuxer_force, audio_stream ? -2 : audio_id, video_id, … … 1308 1338 } 1309 1339 1340 int demuxer_switch_video(demuxer_t *demuxer, int index){ 1341 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_VIDEO, &index); 1342 if (res == DEMUXER_CTRL_NOTIMPL) 1343 index = demuxer->video->id; 1344 return index; 1345 } 1346 1310 1347 int demuxer_add_chapter(demuxer_t* demuxer, const char* name, uint64_t start, uint64_t end){ 1311 1348 if (!demuxer) return 0; -
TabularUnified trunk/libmpdemux/demuxer.h ¶
r262 r263 94 94 #define DEMUXER_CTRL_SWITCH_AUDIO 12 95 95 #define DEMUXER_CTRL_RESYNC 13 96 #define DEMUXER_CTRL_SWITCH_VIDEO 14 97 #define DEMUXER_CTRL_IDENTIFY_PROGRAM 15 96 98 97 99 //#define off_t long long … … 150 152 #define MAX_A_STREAMS 256 151 153 #define MAX_V_STREAMS 256 154 #define MAX_S_STREAMS 32 152 155 153 156 struct demuxer_st; … … 187 190 char* name; 188 191 } demux_chapter_t; 192 193 typedef struct { 194 int progid; //program id 195 int aid, vid, sid; //audio, video and subtitle id 196 } demux_program_t; 189 197 190 198 typedef struct demuxer_st { … … 208 216 void* a_streams[MAX_A_STREAMS]; // audio streams (sh_audio_t) 209 217 void* v_streams[MAX_V_STREAMS]; // video sterams (sh_video_t) 210 char s_streams[32]; // dvd subtitles (flag)218 void *s_streams[MAX_S_STREAMS]; // dvd subtitles (flag) 211 219 demux_chapter_t* chapters; 212 220 int num_chapters; … … 365 373 extern int demuxer_get_percent_pos(demuxer_t *demuxer); 366 374 extern int demuxer_switch_audio(demuxer_t *demuxer, int index); 375 extern int demuxer_switch_video(demuxer_t *demuxer, int index); 367 376 float demux_mov_len(demuxer_t *demuxer); 368 377 float demux_mpg_len(demuxer_t *d); -
TabularUnified trunk/libmpdemux/ebml.h ¶
r248 r263 131 131 #define MATROSKA_ID_CHAPTERDISPLAY 0x80 132 132 #define MATROSKA_ID_CHAPSTRING 0x85 133 133 134 /* IDs in the cluster master */ 134 135 #define MATROSKA_ID_CLUSTERTIMECODE 0xE7 … … 141 142 #define MATROSKA_ID_REFERENCEBLOCK 0xFB 142 143 144 /* IDs in the attachments master */ 145 #define MATROSKA_ID_ATTACHEDFILE 0x61A7 146 #define MATROSKA_ID_FILENAME 0x466E 147 #define MATROSKA_ID_FILEMIMETYPE 0x4660 148 #define MATROSKA_ID_FILEDATA 0x465C 149 #define MATROSKA_ID_FILEUID 0x46AE 143 150 144 151 /* matroska track types */ -
TabularUnified trunk/libmpdemux/makefile ¶
r261 r263 43 43 44 44 INCL = -I$(C_INCLUDE_PATH) -I.. -I..\libdvdread -I..\zlib -I..\libvorbis\include -I..\libvorbis\include\vorbis -I..\libavformat -I..\libavcodec -I..\libavutil -Ilibrtsp -Ifreesdp -Irealrtsp -I$(TOOLKIT_PATH)\h 45 CFLAGS = $(CFLAGS) -DARCH_X86 -DUSE_DVDREAD -DHAVE_VCD -DHAVE_MATROSKA 45 CFLAGS = $(CFLAGS) -DARCH_X86 -DUSE_DVDREAD -DHAVE_VCD -DHAVE_MATROSKA -DHAVE_ZLIB 46 46 47 47 .c.obj: -
TabularUnified trunk/libmpdemux/matroska.h ¶
r181 r263 62 62 #define MKV_S_ASS "S_ASS" // Deprecated 63 63 64 typedef struct {65 char type; // t = text, v = VobSub66 int has_palette; // If we have a valid palette67 unsigned int palette[16]; // for VobSubs68 int width, height; // for VobSubs69 int custom_colors;70 unsigned int colors[4];71 int forced_subs_only;72 } mkv_sh_sub_t;73 74 int demux_mkv_num_subs(demuxer_t *demuxer);75 64 int demux_mkv_change_subs(demuxer_t *demuxer, int new_num); 65 void demux_mkv_get_audio_lang(demuxer_t *demuxer, int track_num, char *lang, 66 int maxlen); 76 67 void demux_mkv_get_sub_lang(demuxer_t *demuxer, int track_num, char *lang, 77 68 int maxlen); 78 69 70 #define MSGTR_MPDEMUX_MKV_ZlibInitializationFailed "[mkv] zlib initialization failed.\n" 71 #define MSGTR_MPDEMUX_MKV_ZlibDecompressionFailed "[mkv] zlib decompression failed.\n" 72 #define MSGTR_MPDEMUX_MKV_LzoInitializationFailed "[mkv] lzo initialization failed.\n" 73 #define MSGTR_MPDEMUX_MKV_LzoDecompressionFailed "[mkv] lzo decompression failed.\n" 74 #define MSGTR_MPDEMUX_MKV_TrackEncrypted "[mkv] Track number %u has been encrypted and decryption has not yet been\n[mkv] implemented. Skipping track.\n" 75 #define MSGTR_MPDEMUX_MKV_UnknownContentEncoding "[mkv] Unknown content encoding type for track %u. Skipping track.\n" 76 #define MSGTR_MPDEMUX_MKV_UnknownCompression "[mkv] Track %u has been compressed with an unknown/unsupported compression\n[mkv] algorithm (%u). Skipping track.\n" 77 #define MSGTR_MPDEMUX_MKV_ZlibCompressionUnsupported "[mkv] Track %u was compressed with zlib but mplayer has not been compiled\n[mkv] with support for zlib compression. Skipping track.\n" 78 #define MSGTR_MPDEMUX_MKV_TrackIDName "[mkv] Track ID %u: %s (%s) \"%s\", %s\n" 79 #define MSGTR_MPDEMUX_MKV_TrackID "[mkv] Track ID %u: %s (%s), %s\n" 80 #define MSGTR_MPDEMUX_MKV_UnknownCodecID "[mkv] Unknown/unsupported CodecID (%s) or missing/bad CodecPrivate\n[mkv] data (track %u).\n" 81 #define MSGTR_MPDEMUX_MKV_FlacTrackDoesNotContainValidHeaders "[mkv] FLAC track does not contain valid headers.\n" 82 #define MSGTR_MPDEMUX_MKV_UnknownAudioCodec "[mkv] Unknown/unsupported audio codec ID '%s' for track %u or missing/faulty\n[mkv] private codec data.\n" 83 #define MSGTR_MPDEMUX_MKV_SubtitleTypeNotSupported "[mkv] Subtitle type '%s' is not supported.\n" 84 #define MSGTR_MPDEMUX_MKV_WillPlayVideoTrack "[mkv] Will play video track %u.\n" 85 #define MSGTR_MPDEMUX_MKV_NoVideoTrackFound "[mkv] No video track found/wanted.\n" 86 #define MSGTR_MPDEMUX_MKV_NoAudioTrackFound "[mkv] No audio track found/wanted.\n" 87 #define MSGTR_MPDEMUX_MKV_WillDisplaySubtitleTrack "[mkv] Will display subtitle track %u.\n" 88 #define MSGTR_MPDEMUX_MKV_NoBlockDurationForSubtitleTrackFound "[mkv] Warning: No BlockDuration for subtitle track found.\n" 89 #define MSGTR_MPDEMUX_MKV_TooManySublines "[mkv] Warning: too many sublines to render, skipping.\n" 90 #define MSGTR_MPDEMUX_MKV_TooManySublinesSkippingAfterFirst "\n[mkv] Warning: too many sublines to render, skipping after first %i.\n" 91 79 92 #endif /* __MATROSKA_H */ -
TabularUnified trunk/libmpdemux/stheader.h ¶
r260 r263 67 67 double pts; // predicted/interpolated PTS of the current frame 68 68 double i_pts; // PTS for the _next_ I/P frame 69 float next_frame_time; 70 double last_pts; 69 71 // output format: (set by demuxer) 70 72 float fps; // frames per second (set only if constant fps) … … 87 89 88 90 #pragma pack() 91 92 typedef struct { 93 int sid; 94 char type; // t = text, v = VobSub, a = SSA/ASS 95 int has_palette; // If we have a valid palette 96 unsigned int palette[16]; // for VobSubs 97 int width, height; // for VobSubs 98 int custom_colors; 99 unsigned int colors[4]; 100 int forced_subs_only; 101 #ifdef USE_ASS 102 ass_track_t* ass_track; // for SSA/ASS streams (type == 'a') 103 #endif 104 } sh_sub_t; 105 89 106 // demuxer.c: 90 107 #define new_sh_audio(d, i) new_sh_audio_aid(d, i, i) … … 92 109 #define new_sh_video(d, i) new_sh_video_vid(d, i, i) 93 110 sh_video_t* new_sh_video_vid(demuxer_t *demuxer,int id,int vid); 94 //sh_audio_t* new_sh_audio(demuxer_t *demuxer,int id); 95 //sh_video_t* new_sh_video(demuxer_t *demuxer,intid);96 void free_sh_audio( sh_audio_t *sh);111 #define new_sh_sub(d, i) new_sh_sub_sid(d, i, i) 112 sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid); 113 void free_sh_audio(demuxer_t *demuxer, int id); 97 114 void free_sh_video(sh_video_t *sh); 98 115 -
TabularUnified trunk/libwin32/realvid.c ¶
r257 r263 147 147 if (RestoreOS2TIB) 148 148 RestoreOS2TIB(); 149 printf("wrvyuv_init passed\n");fflush(stdout);150 149 // setup rv30 codec (codec sub-type and image dimensions): 151 150 if((sh->format<=0x30335652) && (extrahdr[1]>=0x20200002)){ -
TabularUnified trunk/plugins/uniplug.c ¶
r256 r263 129 129 if (err == -EAGAIN) // 130 130 { 131 //printf("eagain\n");131 printf("eagain\n"); 132 132 DosSleep(1); 133 133 continue; -
TabularUnified trunk/video/vdecode.c ¶
r262 r263 53 53 54 54 // ffmpeg 55 #ifndef ARCH_X86 56 #define ARCH_X86 57 #endif 58 59 #include "..\libavutil\bswap.h" 55 60 #include "avcodec.h" 56 61 #include "dsputil.h" … … 598 603 case mmioFOURCC('R', 'V', '3', '0'): 599 604 case mmioFOURCC('R', 'V', '4', '0'): 600 video_context->extradata_size= 8; 601 video_context->extradata = av_mallocz(video_context->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); 602 if(sh_video->bih->biSize!=sizeof(*sh_video->bih)+8){ 605 if(sh_video->bih->biSize<sizeof(*sh_video->bih)+8){ 603 606 /* only 1 packet per frame & sub_id from fourcc */ 607 video_context->extradata_size= 8; 608 video_context->extradata = av_mallocz(video_context->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); 604 609 ((uint32_t*)video_context->extradata)[0] = 0; 605 video_context->sub_id= 606 ((uint32_t*)video_context->extradata)[1] = 610 ((uint32_t*)video_context->extradata)[1] = 607 611 (sh_video->format == mmioFOURCC('R', 'V', '1', '3')) ? 0x10003001 : 0x10000000; 608 612 } else { 609 613 /* has extra slice header (demux_rm or rm->avi streamcopy) */ 610 unsigned int* extrahdr=(unsigned int*)(sh_video->bih+1); 611 ((uint32_t*)video_context->extradata)[0] = be2me_32(extrahdr[0]); 612 video_context->sub_id= extrahdr[1]; 613 ((uint32_t*)video_context->extradata)[1] = be2me_32(extrahdr[1]); 614 video_context->extradata_size = sh_video->bih->biSize-sizeof(BITMAPINFOHEADERw); 615 video_context->extradata = av_mallocz(video_context->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); 616 memcpy(video_context->extradata, sh_video->bih+1, video_context->extradata_size); 614 617 } 618 video_context->sub_id=bswap32(video_context->extradata+4); 615 619 616 620 // printf("%X %X %d %d\n", extrahdr[0], extrahdr[1]); … … 810 814 sh_video->format == mmioFOURCC('R', 'V', '4', '0') || 811 815 sh_video->format == mmioFOURCC('R', 'V', '2', '0')) 812 if(sh_video->bih->biSize ==sizeof(*sh_video->bih)+8)816 if(sh_video->bih->biSize>=sizeof(*sh_video->bih)+8){ 813 817 { 814 818 int i;
Note:
See TracChangeset
for help on using the changeset viewer.