History

iso: support nal lengths other than 4

Sigrid Solveig Haflínudóttir committed 5 years ago

Commit 58c64801 parent d3149941 file · +59 −27Browse files

Unified · Split

iso.c+59−27
@@ -567,16 +567,21 @@ static int · 566 unmodified lines
567dumpstc(Biobuf *f, Biobuf *out, Track *t, u8int *frame)567dumpstc(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
656static int671static int
657dumptrun(Biobuf *f, Biobuf *out, Track *t, u8int *frame)672dumptrun(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
740static int772static int
741dumptrack(Biobuf *f, int id)773dumptrack(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);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t