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