Unified · Split
| @@ -567,16 +567,21 @@ static int · 566 unmodified lines | |||
| 567 | dumpstc(Biobuf *f, Biobuf *out, Track *t, u8int *frame) | 567 | dumpstc(Biobuf *f, Biobuf *out, Track *t, u8int *frame) |
| 568 | { | 568 | { |
| 569 | SampleToChunk *stc; | 569 | SampleToChunk *stc; |
| 570 | u32int si, ch, nextch, n, len; | 570 | u32int si, ch, nextch, n, k, len, sz; |
| 571 | u32int samplelast, sample, rawsz, samplesz; | 571 | u32int samplelast, sample, rawsz, samplesz; |
| 572 | u64int ts; | 572 | u64int ts; |
| 573 | u8int *raw; | 573 | u8int *raw, h[4]; |
| 574 | 574 | ||
| 575 | raw = nil; | 575 | raw = nil; |
| 576 | rawsz = 0; | 576 | rawsz = 0; |
| 577 | sample = samplelast = 0; | 577 | sample = samplelast = 0; |
| 578 | stc = t->stc; | 578 | stc = t->stc; |
| 579 | ch = 0; | 579 | ch = 0; |
| 580 | k = t->video.avc.nallen; | ||
| 581 | h[0] = 0; | ||
| 582 | h[1] = 0; | ||
| 583 | h[2] = 0; | ||
| 584 | h[3] = 1; | ||
| 580 | for(si = 0; si < t->numstc; si++, stc++){ | 585 | for(si = 0; si < t->numstc; si++, stc++){ |
| 581 | nextch = t->numchunks; | 586 | nextch = t->numchunks; |
| 582 | if(si+1 < t->numstc) | 587 | if(si+1 < t->numstc) |
| @@ -613,11 +618,21 @@ dumpstc(Biobuf *f, Biobuf *out, Track *t, u8int *frame) · 30 unmodified lines | |||
| 613 | break; | 618 | break; |
| 614 | } | 619 | } |
| 615 | }else if(t->video.format != 0){ /* all video goes out as IVF */ | 620 | }else if(t->video.format != 0){ /* all video goes out as IVF */ |
| 621 | if(t->video.format == FmtAvc1){ | ||
| 622 | for(sz = 0, n = 0; n < samplesz; n += k+len){ | ||
| 623 | len = raw[n+0]; | ||
| 624 | if(k > 1) len = len<<8 | raw[n+1]; | ||
| 625 | if(k > 2) len = len<<8 | raw[n+2]; | ||
| 626 | if(k > 3) len = len<<8 | raw[n+3]; | ||
| 627 | sz += 4+len; | ||
| 628 | } | ||
| 629 | }else | ||
| 630 | sz = samplesz; | ||
| 616 | ts = tts(t, sample); | 631 | ts = tts(t, sample); |
| 617 | frame[0] = samplesz; | 632 | frame[0] = sz; |
| 618 | frame[1] = samplesz >> 8; | 633 | frame[1] = sz >> 8; |
| 619 | frame[2] = samplesz >> 16; | 634 | frame[2] = sz >> 16; |
| 620 | frame[3] = samplesz >> 24; | 635 | frame[3] = sz >> 24; |
| 621 | frame[4] = ts; | 636 | frame[4] = ts; |
| 622 | frame[5] = ts >> 8; | 637 | frame[5] = ts >> 8; |
| 623 | frame[6] = ts >> 16; | 638 | frame[6] = ts >> 16; |
| @@ -632,15 +647,15 @@ dumpstc(Biobuf *f, Biobuf *out, Track *t, u8int *frame) · 8 unmodified lines | |||
| 632 | } | 647 | } |
| 633 | } | 648 | } |
| 634 | if(t->video.format == FmtAvc1){ | 649 | if(t->video.format == FmtAvc1){ |
| 635 | for(n = 0; n < samplesz; n += len+4){ | 650 | for(n = 0; n < samplesz; n += k+len){ |
| 636 | len = raw[n+0]<<24 | raw[n+1]<<16 | raw[n+2]<<8 | raw[n+3]; | 651 | len = raw[n+0]; |
| 637 | raw[n+0] = 0; | 652 | if(k > 1) len = len<<8 | raw[n+1]; |
| 638 | raw[n+1] = 0; | 653 | if(k > 2) len = len<<8 | raw[n+2]; |
| 639 | raw[n+2] = 0; | 654 | if(k > 3) len = len<<8 | raw[n+3]; |
| 640 | raw[n+3] = 1; | 655 | Bwrite(out, h, 4); |
| 656 | Bwrite(out, raw+n+k, len); | ||
| 641 | } | 657 | } |
| 642 | } | 658 | }else if(Bwrite(out, raw, samplesz) != samplesz){ /* EOF? */ |
| 643 | if(Bwrite(out, raw, samplesz) != samplesz){ /* EOF? */ | ||
| 644 | werrstr("eof"); | 659 | werrstr("eof"); |
| 645 | break; | 660 | break; |
| 646 | } | 661 | } |
| @@ -656,9 +671,9 @@ dumpstc(Biobuf *f, Biobuf *out, Track *t, u8int *frame) · 9 unmodified lines | |||
| 656 | static int | 671 | static int |
| 657 | dumptrun(Biobuf *f, Biobuf *out, Track *t, u8int *frame) | 672 | dumptrun(Biobuf *f, Biobuf *out, Track *t, u8int *frame) |
| 658 | { | 673 | { |
| 659 | int i, j, len, n; | 674 | int i, j, len, n, k; |
| 660 | u64int ts; | 675 | u64int ts; |
| 661 | u8int *raw; | 676 | u8int *raw, h[4]; |
| 662 | int maxsz, sz; | 677 | int maxsz, sz; |
| 663 | RunSample *s; | 678 | RunSample *s; |
| 664 | Moof *m; | 679 | Moof *m; |
| @@ -668,6 +683,11 @@ dumptrun(Biobuf *f, Biobuf *out, Track *t, u8int *frame) · 3 unmodified lines | |||
| 668 | ts = 0; | 683 | ts = 0; |
| 669 | maxsz = 0; | 684 | maxsz = 0; |
| 670 | raw = nil; | 685 | raw = nil; |
| 686 | k = t->video.avc.nallen; | ||
| 687 | h[0] = 0; | ||
| 688 | h[1] = 0; | ||
| 689 | h[2] = 0; | ||
| 690 | h[3] = 1; | ||
| 671 | for(i = 0, m = t->moof; i < t->nmoof; i++, m++){ | 691 | for(i = 0, m = t->moof; i < t->nmoof; i++, m++){ |
| 672 | for(j = 0; j < m->trun.trun.samplecount; j++){ | 692 | for(j = 0; j < m->trun.trun.samplecount; j++){ |
| 673 | s = &m->trun.trun.samples[j]; | 693 | s = &m->trun.trun.samples[j]; |
| @@ -717,15 +737,27 @@ dumptrun(Biobuf *f, Biobuf *out, Track *t, u8int *frame) · 43 unmodified lines | |||
| 717 | return -1; | 737 | return -1; |
| 718 | } | 738 | } |
| 719 | if(t->video.format == FmtAvc1){ | 739 | if(t->video.format == FmtAvc1){ |
| 720 | for(n = 12; n < 12+s->size; n += len+4){ | 740 | for(sz = 0, n = 12; n < 12+s->size; n += len+k){ |
| 721 | len = raw[n+0]<<24 | raw[n+1]<<16 | raw[n+2]<<8 | raw[n+3]; | 741 | len = raw[n+0]; |
| 722 | raw[n+0] = 0; | 742 | if(k > 1) len = len<<8 | raw[n+1]; |
| 723 | raw[n+1] = 0; | 743 | if(k > 2) len = len<<8 | raw[n+2]; |
| 724 | raw[n+2] = 0; | 744 | if(k > 3) len = len<<8 | raw[n+3]; |
| 725 | raw[n+3] = 1; | 745 | sz += 4+len; |
| 726 | } | 746 | } |
| 727 | } | 747 | raw[0] = sz; |
| 728 | if(Bwrite(out, raw, 12 + s->size) != 12 + s->size) /* eof? */ | 748 | raw[1] = sz >> 8; |
| 749 | raw[2] = sz >> 16; | ||
| 750 | raw[3] = sz >> 24; | ||
| 751 | Bwrite(out, raw, 12); | ||
| 752 | for(n = 12; n < 12+s->size; n += len+k){ | ||
| 753 | len = raw[n+0]; | ||
| 754 | if(k > 1) len = len<<8 | raw[n+1]; | ||
| 755 | if(k > 2) len = len<<8 | raw[n+2]; | ||
| 756 | if(k > 3) len = len<<8 | raw[n+3]; | ||
| 757 | Bwrite(out, h, 4); | ||
| 758 | Bwrite(out, raw+n+k, len); | ||
| 759 | } | ||
| 760 | }else if(Bwrite(out, raw, 12 + s->size) != 12 + s->size) /* eof? */ | ||
| 729 | break; | 761 | break; |
| 730 | ts += s->duration; /* sample's "time offset" is ignored here */ | 762 | ts += s->duration; /* sample's "time offset" is ignored here */ |
| 731 | }else{ | 763 | }else{ |
| @@ -740,7 +772,7 @@ dumptrun(Biobuf *f, Biobuf *out, Track *t, u8int *frame) · 8 unmodified lines | |||
| 740 | static int | 772 | static int |
| 741 | dumptrack(Biobuf *f, int id) | 773 | dumptrack(Biobuf *f, int id) |
| 742 | { | 774 | { |
| 743 | int i, j, x, res; | 775 | int i, j, x, k, res; |
| 744 | Biobuf out; | 776 | Biobuf out; |
| 745 | u64int dur; | 777 | u64int dur; |
| 746 | Track *t; | 778 | Track *t; |
| @@ -832,8 +864,8 @@ dumptrack(Biobuf *f, int id) · 85 unmodified lines | |||
| 832 | Bwrite(&out, frame, 0x20); | 864 | Bwrite(&out, frame, 0x20); |
| 833 | 865 | ||
| 834 | if(t->video.format == FmtAvc1){ | 866 | if(t->video.format == FmtAvc1){ |
| 835 | if(t->video.avc.nallen != 4){ | 867 | if(t->video.avc.nallen < 1 || t->video.avc.nallen > 4){ |
| 836 | werrstr("avc1 nallen != 4 isn't supported yet"); | 868 | werrstr("avc1: invalid nallen %d", t->video.avc.nallen); |
| 837 | return -1; | 869 | return -1; |
| 838 | } | 870 | } |
| 839 | memset(frame, 0, 4+8+4); | 871 | memset(frame, 0, 4+8+4); |