summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/codecs/libalac/demux.c69
1 files changed, 44 insertions, 25 deletions
diff --git a/apps/codecs/libalac/demux.c b/apps/codecs/libalac/demux.c
index 23f6d82622..80963a2fce 100644
--- a/apps/codecs/libalac/demux.c
+++ b/apps/codecs/libalac/demux.c
@@ -133,7 +133,7 @@ static void read_chunk_hdlr(qtmovie_t *qtmovie, size_t chunk_len)
133 133
134} 134}
135 135
136static void read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len) 136static bool read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len)
137{ 137{
138 unsigned int i; 138 unsigned int i;
139 uint32_t numentries; 139 uint32_t numentries;
@@ -154,7 +154,7 @@ static void read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len)
154 if (numentries != 1) 154 if (numentries != 1)
155 { 155 {
156 //fprintf(stderr, "only expecting one entry in sample description atom!\n"); 156 //fprintf(stderr, "only expecting one entry in sample description atom!\n");
157 return; 157 return false;
158 } 158 }
159 159
160 for (i = 0; i < numentries; i++) 160 for (i = 0; i < numentries; i++)
@@ -249,9 +249,10 @@ static void read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len)
249 { 249 {
250// fprintf(stderr, "expecting 'alac' data format, got %c%c%c%c\n", 250// fprintf(stderr, "expecting 'alac' data format, got %c%c%c%c\n",
251// SPLITFOURCC(qtmovie->res->format)); 251// SPLITFOURCC(qtmovie->res->format));
252 return; 252 return false;
253 } 253 }
254 } 254 }
255 return true;
255} 256}
256 257
257static void read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len) 258static void read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len)
@@ -333,7 +334,7 @@ static void read_chunk_stsz(qtmovie_t *qtmovie, size_t chunk_len)
333 } 334 }
334} 335}
335 336
336static void read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len) 337static bool read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len)
337{ 338{
338 size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ 339 size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
339 340
@@ -346,7 +347,7 @@ static void read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len)
346 if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) 347 if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining)
347 { 348 {
348 //fprintf(stderr, "strange size for chunk inside stbl\n"); 349 //fprintf(stderr, "strange size for chunk inside stbl\n");
349 return; 350 return false;
350 } 351 }
351 352
352 sub_chunk_id = stream_read_uint32(qtmovie->stream); 353 sub_chunk_id = stream_read_uint32(qtmovie->stream);
@@ -354,7 +355,9 @@ static void read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len)
354 switch (sub_chunk_id) 355 switch (sub_chunk_id)
355 { 356 {
356 case MAKEFOURCC('s','t','s','d'): 357 case MAKEFOURCC('s','t','s','d'):
357 read_chunk_stsd(qtmovie, sub_chunk_len); 358 if (!read_chunk_stsd(qtmovie, sub_chunk_len)) {
359 return false;
360 }
358 break; 361 break;
359 case MAKEFOURCC('s','t','t','s'): 362 case MAKEFOURCC('s','t','t','s'):
360 read_chunk_stts(qtmovie, sub_chunk_len); 363 read_chunk_stts(qtmovie, sub_chunk_len);
@@ -370,14 +373,15 @@ static void read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len)
370 default: 373 default:
371// fprintf(stderr, "(stbl) unknown chunk id: %c%c%c%c\n", 374// fprintf(stderr, "(stbl) unknown chunk id: %c%c%c%c\n",
372// SPLITFOURCC(sub_chunk_id)); 375// SPLITFOURCC(sub_chunk_id));
373 return; 376 return false;
374 } 377 }
375 378
376 size_remaining -= sub_chunk_len; 379 size_remaining -= sub_chunk_len;
377 } 380 }
381 return true;
378} 382}
379 383
380static void read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len) 384static bool read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len)
381{ 385{
382 size_t dinf_size, stbl_size; 386 size_t dinf_size, stbl_size;
383 size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ 387 size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
@@ -386,12 +390,12 @@ static void read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len)
386 if (stream_read_uint32(qtmovie->stream) != 16) 390 if (stream_read_uint32(qtmovie->stream) != 16)
387 { 391 {
388 //fprintf(stderr, "unexpected size in media info\n"); 392 //fprintf(stderr, "unexpected size in media info\n");
389 return; 393 return false;
390 } 394 }
391 if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','m','h','d')) 395 if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','m','h','d'))
392 { 396 {
393 //fprintf(stderr, "not a sound header! can't handle this.\n"); 397 //fprintf(stderr, "not a sound header! can't handle this.\n");
394 return; 398 return false;
395 } 399 }
396 /* now skip the rest */ 400 /* now skip the rest */
397 stream_skip(qtmovie->stream, 16 - 8); 401 stream_skip(qtmovie->stream, 16 - 8);
@@ -403,7 +407,7 @@ static void read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len)
403 if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('d','i','n','f')) 407 if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('d','i','n','f'))
404 { 408 {
405 //fprintf(stderr, "expected dinf, didn't get it.\n"); 409 //fprintf(stderr, "expected dinf, didn't get it.\n");
406 return; 410 return false;
407 } 411 }
408 /* skip it */ 412 /* skip it */
409 stream_skip(qtmovie->stream, dinf_size - 8); 413 stream_skip(qtmovie->stream, dinf_size - 8);
@@ -416,9 +420,12 @@ static void read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len)
416 if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','t','b','l')) 420 if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','t','b','l'))
417 { 421 {
418 //fprintf(stderr, "expected stbl, didn't get it.\n"); 422 //fprintf(stderr, "expected stbl, didn't get it.\n");
419 return; 423 return false;
424 }
425 if (!read_chunk_stbl(qtmovie, stbl_size)) {
426 return false;
420 } 427 }
421 read_chunk_stbl(qtmovie, stbl_size); 428
422 size_remaining -= stbl_size; 429 size_remaining -= stbl_size;
423 430
424 if (size_remaining) 431 if (size_remaining)
@@ -426,9 +433,10 @@ static void read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len)
426 //fprintf(stderr, "oops\n"); 433 //fprintf(stderr, "oops\n");
427 stream_skip(qtmovie->stream, size_remaining); 434 stream_skip(qtmovie->stream, size_remaining);
428 } 435 }
436 return true;
429} 437}
430 438
431static void read_chunk_mdia(qtmovie_t *qtmovie, size_t chunk_len) 439static bool read_chunk_mdia(qtmovie_t *qtmovie, size_t chunk_len)
432{ 440{
433 size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ 441 size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
434 442
@@ -441,7 +449,7 @@ static void read_chunk_mdia(qtmovie_t *qtmovie, size_t chunk_len)
441 if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) 449 if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining)
442 { 450 {
443 //fprintf(stderr, "strange size for chunk inside mdia\n"); 451 //fprintf(stderr, "strange size for chunk inside mdia\n");
444 return; 452 return false;
445 } 453 }
446 454
447 sub_chunk_id = stream_read_uint32(qtmovie->stream); 455 sub_chunk_id = stream_read_uint32(qtmovie->stream);
@@ -455,20 +463,23 @@ static void read_chunk_mdia(qtmovie_t *qtmovie, size_t chunk_len)
455 read_chunk_hdlr(qtmovie, sub_chunk_len); 463 read_chunk_hdlr(qtmovie, sub_chunk_len);
456 break; 464 break;
457 case MAKEFOURCC('m','i','n','f'): 465 case MAKEFOURCC('m','i','n','f'):
458 read_chunk_minf(qtmovie, sub_chunk_len); 466 if (!read_chunk_minf(qtmovie, sub_chunk_len)) {
467 return false;
468 }
459 break; 469 break;
460 default: 470 default:
461// fprintf(stderr, "(mdia) unknown chunk id: %c%c%c%c\n", 471// fprintf(stderr, "(mdia) unknown chunk id: %c%c%c%c\n",
462// SPLITFOURCC(sub_chunk_id)); 472// SPLITFOURCC(sub_chunk_id));
463 return; 473 return false;
464 } 474 }
465 475
466 size_remaining -= sub_chunk_len; 476 size_remaining -= sub_chunk_len;
467 } 477 }
478 return true;
468} 479}
469 480
470/* 'trak' - a movie track - contains other atoms */ 481/* 'trak' - a movie track - contains other atoms */
471static void read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len) 482static bool read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len)
472{ 483{
473 size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ 484 size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
474 485
@@ -481,7 +492,7 @@ static void read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len)
481 if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) 492 if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining)
482 { 493 {
483 //fprintf(stderr, "strange size for chunk inside trak\n"); 494 //fprintf(stderr, "strange size for chunk inside trak\n");
484 return; 495 return false;
485 } 496 }
486 497
487 sub_chunk_id = stream_read_uint32(qtmovie->stream); 498 sub_chunk_id = stream_read_uint32(qtmovie->stream);
@@ -492,7 +503,9 @@ static void read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len)
492 read_chunk_tkhd(qtmovie, sub_chunk_len); 503 read_chunk_tkhd(qtmovie, sub_chunk_len);
493 break; 504 break;
494 case MAKEFOURCC('m','d','i','a'): 505 case MAKEFOURCC('m','d','i','a'):
495 read_chunk_mdia(qtmovie, sub_chunk_len); 506 if (!read_chunk_mdia(qtmovie, sub_chunk_len)) {
507 return false;
508 }
496 break; 509 break;
497 default: 510 default:
498// fprintf(stderr, "(trak) unknown chunk id: %c%c%c%c\n", 511// fprintf(stderr, "(trak) unknown chunk id: %c%c%c%c\n",
@@ -503,6 +516,7 @@ static void read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len)
503 516
504 size_remaining -= sub_chunk_len; 517 size_remaining -= sub_chunk_len;
505 } 518 }
519 return true;
506} 520}
507 521
508/* 'mvhd' movie header atom */ 522/* 'mvhd' movie header atom */
@@ -524,7 +538,7 @@ static void read_chunk_udta(qtmovie_t *qtmovie, size_t chunk_len)
524} 538}
525 539
526/* 'moov' movie atom - contains other atoms */ 540/* 'moov' movie atom - contains other atoms */
527static void read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len) 541static bool read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len)
528{ 542{
529 size_t size_remaining = chunk_len - 8; /* FIXME WRONG */ 543 size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
530 544
@@ -537,7 +551,7 @@ static void read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len)
537 if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining) 551 if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining)
538 { 552 {
539 //fprintf(stderr, "strange size for chunk inside moov\n"); 553 //fprintf(stderr, "strange size for chunk inside moov\n");
540 return; 554 return false;
541 } 555 }
542 556
543 sub_chunk_id = stream_read_uint32(qtmovie->stream); 557 sub_chunk_id = stream_read_uint32(qtmovie->stream);
@@ -548,7 +562,9 @@ static void read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len)
548 read_chunk_mvhd(qtmovie, sub_chunk_len); 562 read_chunk_mvhd(qtmovie, sub_chunk_len);
549 break; 563 break;
550 case MAKEFOURCC('t','r','a','k'): 564 case MAKEFOURCC('t','r','a','k'):
551 read_chunk_trak(qtmovie, sub_chunk_len); 565 if (!read_chunk_trak(qtmovie, sub_chunk_len)) {
566 return false;
567 }
552 break; 568 break;
553 case MAKEFOURCC('u','d','t','a'): 569 case MAKEFOURCC('u','d','t','a'):
554 read_chunk_udta(qtmovie, sub_chunk_len); 570 read_chunk_udta(qtmovie, sub_chunk_len);
@@ -556,11 +572,12 @@ static void read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len)
556 default: 572 default:
557// fprintf(stderr, "(moov) unknown chunk id: %c%c%c%c\n", 573// fprintf(stderr, "(moov) unknown chunk id: %c%c%c%c\n",
558// SPLITFOURCC(sub_chunk_id)); 574// SPLITFOURCC(sub_chunk_id));
559 return; 575 return false;
560 } 576 }
561 577
562 size_remaining -= sub_chunk_len; 578 size_remaining -= sub_chunk_len;
563 } 579 }
580 return true;
564} 581}
565 582
566static void read_chunk_mdat(qtmovie_t *qtmovie, size_t chunk_len) 583static void read_chunk_mdat(qtmovie_t *qtmovie, size_t chunk_len)
@@ -608,7 +625,9 @@ int qtmovie_read(stream_t *file, demux_res_t *demux_res)
608 read_chunk_ftyp(&qtmovie, chunk_len); 625 read_chunk_ftyp(&qtmovie, chunk_len);
609 break; 626 break;
610 case MAKEFOURCC('m','o','o','v'): 627 case MAKEFOURCC('m','o','o','v'):
611 read_chunk_moov(&qtmovie, chunk_len); 628 if (!read_chunk_moov(&qtmovie, chunk_len)) {
629 return 0;
630 }
612 break; 631 break;
613 /* once we hit mdat we stop reading and return. 632 /* once we hit mdat we stop reading and return.
614 * this is on the assumption that there is no furhter interesting 633 * this is on the assumption that there is no furhter interesting