[NUT] (ods15): r93 - in /trunk: libnut/demuxer.c libnut/muxer.c libnut/nut.h libnut/priv.h nututils/demux_avi.c nututils/demux_ogg.c nututils/nutmerge.c

Author: ods15 Date: Sat Mar 11 16:35:56 2006 New Revision: 93 Log: sync to spec, remove sflags, checksums after frame headers Modified: trunk/libnut/demuxer.c trunk/libnut/muxer.c trunk/libnut/nut.h trunk/libnut/priv.h trunk/nututils/demux_avi.c trunk/nututils/demux_ogg.c trunk/nututils/nutmerge.c Modified: trunk/libnut/demuxer.c ============================================================================== --- trunk/libnut/demuxer.c (original) +++ trunk/libnut/demuxer.c Sat Mar 11 16:35:56 2006 @@ -200,7 +200,7 @@ GET_V(in, forward_ptr); if (forward_ptr > 4096) { - skip_buffer(in, 4); // header_checksum + CHECK(skip_buffer(in, 4)); // header_checksum ERROR(crc32(get_buf(in, start), bctello(in) - start), -ERR_BAD_CHECKSUM); } @@ -220,7 +220,7 @@ static int get_main_header(nut_context_t * nut) { input_buffer_t itmp, * tmp = new_mem_buffer(&itmp); int i, j, err = 0; - int flag, fields, timestamp = 0, mul = 1, stream = 0, sflag, size, count, reserved; + int flag, fields, timestamp = 0, mul = 1, stream = 0, size, count, reserved; CHECK(get_header(nut->i, tmp)); @@ -234,21 +234,17 @@ int scrap; GET_V(tmp, flag); GET_V(tmp, fields); - if (fields > 0) GET_V(tmp, sflag); - else sflag = 0; - if (fields > 1) GET_S(tmp, timestamp); - if (fields > 2) GET_V(tmp, mul); - if (fields > 3) GET_V(tmp, stream); - if (fields > 4) GET_V(tmp, size); + if (fields > 0) GET_S(tmp, timestamp); + if (fields > 1) GET_V(tmp, mul); + if (fields > 2) GET_V(tmp, stream); + if (fields > 3) GET_V(tmp, size); else size = 0; - if (fields > 5) GET_V(tmp, reserved); + if (fields > 4) GET_V(tmp, reserved); else reserved = 0; - if (fields > 6) GET_V(tmp, count); + if (fields > 5) GET_V(tmp, count); else count = mul - size; - for (j = 7; j < fields; j++) { - GET_V(tmp, scrap); - } + for (j = 6; j < fields; j++) GET_V(tmp, scrap); for(j = 0; j < count && i < 256; j++, i++) { if (i == 'N') { @@ -257,7 +253,6 @@ continue; } nut->ft[i].flags = flag; - nut->ft[i].stream_flags = sflag; nut->ft[i].stream_plus1 = stream; nut->ft[i].mul = mul; nut->ft[i].lsb = size + j; @@ -483,17 +478,16 @@ } static int get_packet(nut_context_t * nut, nut_packet_t * pd, int * saw_syncpoint) { - int err = 0; - off_t after_sync = 0; uint64_t tmp; - int coded_pts, size_lsb = 0, stream_flags = 0, i; + int err = 0, after_sync = 0, checksum = 0, flags, i; + off_t start; CHECK(get_bytes(nut->i, 1, &tmp)); // frame_code or 'N' if (tmp == 'N') { CHECK(get_bytes(nut->i, 7, &tmp)); tmp |= (uint64_t)'N' << 56; if (tmp == SYNCPOINT_STARTCODE) { - after_sync = bctello(nut->i); + after_sync = 1; CHECK(get_syncpoint(nut)); CHECK(get_bytes(nut->i, 1, &tmp)); } else { @@ -502,15 +496,19 @@ } } - ERROR(nut->ft[tmp].flags & INVALID_FLAG, -ERR_NOT_FRAME_NOT_N); - + start = bctello(nut->i) - 1; pd->type = e_frame; + + flags = nut->ft[tmp].flags; + ERROR(flags & FLAG_INVALID, -ERR_NOT_FRAME_NOT_N); + if (!nut->ft[tmp].stream_plus1) GET_V(nut->i, pd->stream); else pd->stream = nut->ft[tmp].stream_plus1 - 1; ERROR(pd->stream >= nut->stream_count, -ERR_NOT_FRAME_NOT_N); if (!nut->ft[tmp].pts_delta) { + uint64_t coded_pts; GET_V(nut->i, coded_pts); if (coded_pts >= (1 << nut->sc[pd->stream].msb_pts_shift)) pd->pts = coded_pts - (1 << nut->sc[pd->stream].msb_pts_shift); @@ -524,25 +522,32 @@ pd->pts = nut->sc[pd->stream].last_pts + nut->ft[tmp].pts_delta; } - if (nut->ft[tmp].flags & MSB_CODED_FLAG) GET_V(nut->i, size_lsb); - pd->len = size_lsb * nut->ft[tmp].mul + nut->ft[tmp].lsb; - - if (nut->ft[tmp].flags & STREAM_CODED_FLAG) GET_V(nut->i, stream_flags); - pd->flags = nut->ft[tmp].stream_flags ^ stream_flags; + if (flags & FLAG_CODED) { + int coded_flags; + GET_V(nut->i, coded_flags); + flags ^= coded_flags; + } + pd->flags = flags & NUT_API_FLAGS; + + if (flags & FLAG_SIZE_MSB) { + int size_msb; + GET_V(nut->i, size_msb); + pd->len = size_msb * nut->ft[tmp].mul + nut->ft[tmp].lsb; + } else pd->len = nut->ft[tmp].lsb; for (i = 0; i < nut->ft[tmp].reserved; i++) { int scrap; GET_V(nut->i, scrap); } - if (0) { - uint64_t checksum; - off_t pos = bctello(nut->i); - CHECK(get_bytes(nut->i, 4, &checksum)); - ERROR(checksum != crc32(nut->i->buf_ptr - (bctello(nut->i) - after_sync), pos - after_sync), -ERR_BAD_CHECKSUM); + if (flags & FLAG_CHECKSUM) { + CHECK(skip_buffer(nut->i, 4)); // header_checksum + ERROR(crc32(nut->i->buf_ptr - (bctello(nut->i) - start), bctello(nut->i) - start), -ERR_BAD_CHECKSUM); + checksum = 1; } // error checking - max distance ERROR(!after_sync && bctello(nut->i) + pd->len - nut->last_syncpoint > nut->max_distance, -ERR_MAX_DISTANCE); + ERROR(!checksum && pd->len > nut->max_distance, -ERR_MAX_DISTANCE); // error checking - max pts distance - ERROR(!after_sync && ABS((int64_t)pd->pts - (int64_t)nut->sc[pd->stream].last_pts) > nut->sc[pd->stream].max_pts_distance, -ERR_MAX_PTS_DISTANCE); + ERROR(!checksum && ABS((int64_t)pd->pts - (int64_t)nut->sc[pd->stream].last_pts) > nut->sc[pd->stream].max_pts_distance, -ERR_MAX_PTS_DISTANCE); // error checking - out of order dts for (i = 0; i < nut->stream_count; i++) { if (nut->sc[i].last_dts == -1) continue; @@ -562,8 +567,8 @@ stream_context_t * sc = &nut->sc[pd->stream]; sc->last_pts = pd->pts; sc->last_dts = get_dts(sc->sh.decode_delay, sc->pts_cache, pd->pts); - if (pd->flags & NUT_KEY_STREAM_FLAG && !sc->last_key) sc->last_key = pd->pts + 1; - if (pd->flags & NUT_EOR_STREAM_FLAG) sc->eor = pd->pts + 1; + if (pd->flags & NUT_FLAG_KEY && !sc->last_key) sc->last_key = pd->pts + 1; + if (pd->flags & NUT_FLAG_EOR) sc->eor = pd->pts + 1; else sc->eor = 0; } @@ -1010,10 +1015,10 @@ } if (n) break; // pts for all active streams higher than requested pts } - if (pd.flags & NUT_KEY_STREAM_FLAG) { + if (pd.flags & NUT_FLAG_KEY) { if (pd.pts <= pts[pd.stream]>>1) { good_key[pd.stream] = buf_before<<1; - if (pd.flags & NUT_EOR_STREAM_FLAG) good_key[pd.stream] = 0; + if (pd.flags & NUT_FLAG_EOR) good_key[pd.stream] = 0; } if (!end && pd.pts >= pts[pd.stream]>>1) { // forward seek end if (saw_syncpoint) nut->last_syncpoint = 0; @@ -1021,7 +1026,7 @@ break; } } - } else if (stopper && pd.flags&NUT_KEY_STREAM_FLAG && !(good_key[i]&1)) { + } else if (stopper && pd.flags&NUT_FLAG_KEY && !(good_key[i]&1)) { TO_PTS(stopper, stopper->pts) if (compare_ts(nut, stopper_p, stopper_s, pd.pts, pd.stream) > 0) { good_key[pd.stream] = buf_before<<1; Modified: trunk/libnut/muxer.c ============================================================================== --- trunk/libnut/muxer.c (original) +++ trunk/libnut/muxer.c Sat Mar 11 16:35:56 2006 @@ -135,7 +135,7 @@ static void put_main_header(nut_context_t * nut) { output_buffer_t * tmp = clear_buffer(nut->tmp_buffer); int i; - int flag, fields, sflag, timestamp = 0, mul = 1, stream = 0, size, count; + int flag, fields, timestamp = 0, mul = 1, stream = 0, size, count; put_v(tmp, NUT_VERSION); put_v(tmp, nut->stream_count); @@ -143,37 +143,33 @@ for(i = 0; i < 256; ) { fields = 0; flag = nut->ft[i].flags; - if (nut->ft[i].stream_flags != 0) fields = 1; - sflag = nut->ft[i].stream_flags; - if (nut->ft[i].pts_delta != timestamp) fields = 2; + if (nut->ft[i].pts_delta != timestamp) fields = 1; timestamp = nut->ft[i].pts_delta; - if (nut->ft[i].mul != mul) fields = 3; + if (nut->ft[i].mul != mul) fields = 2; mul = nut->ft[i].mul; - if (nut->ft[i].stream_plus1 != stream) fields = 4; + if (nut->ft[i].stream_plus1 != stream) fields = 3; stream = nut->ft[i].stream_plus1; - if (nut->ft[i].lsb != 0) fields = 5; + if (nut->ft[i].lsb != 0) fields = 4; size = nut->ft[i].lsb; for (count = 0; i < 256; count++, i++) { if (i == 'N') { count--; continue; } if (nut->ft[i].flags != flag) break; - if (nut->ft[i].stream_flags != sflag) break; if (nut->ft[i].stream_plus1 != stream) break; if (nut->ft[i].mul != mul) break; if (nut->ft[i].lsb != size + count) break; if (nut->ft[i].pts_delta != timestamp) break; } - if (count != mul - size) fields = 7; + if (count != mul - size) fields = 6; put_v(tmp, flag); put_v(tmp, fields); - if (fields > 0) put_v(tmp, sflag); - if (fields > 1) put_s(tmp, timestamp); - if (fields > 2) put_v(tmp, mul); - if (fields > 3) put_v(tmp, stream); - if (fields > 4) put_v(tmp, size); - if (fields > 5) put_v(tmp, 0); // reserved - if (fields > 6) put_v(tmp, count); + if (fields > 0) put_s(tmp, timestamp); + if (fields > 1) put_v(tmp, mul); + if (fields > 2) put_v(tmp, stream); + if (fields > 3) put_v(tmp, size); + if (fields > 4) put_v(tmp, 0); // reserved + if (fields > 5) put_v(tmp, count); } put_header(nut->o, tmp, nut->tmp_buffer2, MAIN_STARTCODE, 0); @@ -386,65 +382,82 @@ put_header(nut->o, tmp, nut->tmp_buffer2, INDEX_STARTCODE, 1); } -static int frame_header(nut_context_t * nut, const nut_packet_t * fd, int * rftnum) { - int i, ftnum = -1, size = 0, coded_pts, pts_delta; +static int frame_header(nut_context_t * nut, output_buffer_t * tmp, const nut_packet_t * fd) { stream_context_t * sc = &nut->sc[fd->stream]; - pts_delta = fd->pts - sc->last_pts; - // ### check lsb pts - if (MAX(pts_delta, -pts_delta) < (1 << (sc->msb_pts_shift - 1)) - 1) - coded_pts = fd->pts & ((1 << sc->msb_pts_shift) - 1); - else - coded_pts = fd->pts + (1 << sc->msb_pts_shift); + int i, ftnum = -1, size = 0, coded_pts, coded_flags = 0, msb_pts = (1 << sc->msb_pts_shift); + int checksum = 0, pts_delta = (int64_t)fd->pts - (int64_t)sc->last_pts; + + if (ABS(pts_delta) < (msb_pts/2) - 1) coded_pts = fd->pts & (msb_pts - 1); + else coded_pts = fd->pts + msb_pts; + + if (fd->len > nut->max_distance) checksum = 1; + if (ABS(pts_delta) > sc->max_pts_distance) { + fprintf(stderr, "%d > %d || %d - %d > %d \n", fd->len, nut->max_distance, (int)fd->pts, (int)sc->last_pts, sc->max_pts_distance); + checksum = 1; + } + for (i = 0; i < 256; i++) { - int len = 1; - if (nut->ft[i].flags & INVALID_FLAG) continue; + int len = 1; // frame code + int flags = nut->ft[i].flags; + if (flags & FLAG_INVALID) continue; if (nut->ft[i].stream_plus1 && nut->ft[i].stream_plus1 - 1 != fd->stream) continue; if (nut->ft[i].pts_delta && nut->ft[i].pts_delta != pts_delta) continue; - if (nut->ft[i].flags & MSB_CODED_FLAG) { - if ((fd->len - nut->ft[i].lsb) % nut->ft[i].mul) continue; - } else { - if (nut->ft[i].lsb != fd->len) continue; - } - if (!(nut->ft[i].flags & STREAM_CODED_FLAG) && (fd->flags & 3) != nut->ft[i].stream_flags) continue; - len += nut->ft[i].stream_plus1 ? 0 : v_len(fd->stream); - len += nut->ft[i].pts_delta ? 0 : v_len(coded_pts); - len += nut->ft[i].flags & MSB_CODED_FLAG ? v_len((fd->len - nut->ft[i].lsb) / nut->ft[i].mul) : 0; - len += nut->ft[i].flags & STREAM_CODED_FLAG ? v_len((fd->flags & 3) ^ nut->ft[i].stream_flags) : 0; - if (!size || len < size) { ftnum = i; size = len; } + if (flags & FLAG_CODED) { + flags = fd->flags & NUT_API_FLAGS; + if (nut->ft[i].lsb != fd->len) flags |= FLAG_SIZE_MSB; + if (checksum) flags |= FLAG_CHECKSUM; + flags |= FLAG_CODED; + } + if (flags & FLAG_SIZE_MSB) { if ((fd->len - nut->ft[i].lsb) % nut->ft[i].mul) continue; } + else { if (nut->ft[i].lsb != fd->len) continue; } + if ((flags ^ fd->flags) & NUT_API_FLAGS) continue; + if (checksum && !(flags & FLAG_CHECKSUM)) continue; + + len += nut->ft[i].stream_plus1 ? 0 : v_len(fd->stream); + len += nut->ft[i].pts_delta ? 0 : v_len(coded_pts); + len += !(flags & FLAG_CODED) ? 0 : v_len(flags ^ nut->ft[i].flags); + len += !(flags & FLAG_SIZE_MSB) ? 0 : v_len((fd->len - nut->ft[i].lsb) / nut->ft[i].mul); + len += !(flags & FLAG_CHECKSUM) ? 0 : 4; + if (!size || len < size) { ftnum = i; coded_flags = flags; size = len; } } assert(ftnum != -1); - if (rftnum) *rftnum = ftnum; + if (tmp) { + put_bytes(tmp, 1, ftnum); // frame_code + if (!nut->ft[ftnum].stream_plus1) put_v(tmp, fd->stream); + if (!nut->ft[ftnum].pts_delta) put_v(tmp, coded_pts); + if (coded_flags & FLAG_CODED) put_v(tmp, coded_flags ^ nut->ft[ftnum].flags); + if (coded_flags & FLAG_SIZE_MSB) put_v(tmp, (fd->len - nut->ft[ftnum].lsb) / nut->ft[ftnum].mul); + if (coded_flags & FLAG_CHECKSUM) put_bytes(tmp, 4, crc32(tmp->buf, bctello(tmp))); + } return size; } -static void put_frame(nut_context_t * nut, const nut_packet_t * fd, const uint8_t * data) { - output_buffer_t * tmp = clear_buffer(nut->tmp_buffer); +void nut_write_frame(nut_context_t * nut, const nut_packet_t * fd, const uint8_t * buf) { stream_context_t * sc = &nut->sc[fd->stream]; - int ftnum = -1, coded_pts, pts_delta = fd->pts - sc->last_pts; - int i; - - if (ABS(pts_delta) < (1 << (sc->msb_pts_shift - 1)) - 1) - coded_pts = fd->pts & ((1 << sc->msb_pts_shift) - 1); - else - coded_pts = fd->pts + (1 << sc->msb_pts_shift); - - sc->overhead += frame_header(nut, fd, &ftnum); - - put_bytes(tmp, 1, ftnum); // frame_code - - if (!nut->ft[ftnum].stream_plus1) put_v(tmp, fd->stream); - if (!nut->ft[ftnum].pts_delta) put_v(tmp, coded_pts); - if (nut->ft[ftnum].flags & MSB_CODED_FLAG) - put_v(tmp, (fd->len - nut->ft[ftnum].lsb) / nut->ft[ftnum].mul); - if (nut->ft[ftnum].flags & STREAM_CODED_FLAG) - put_v(tmp, (fd->flags & 3) ^ nut->ft[ftnum].stream_flags); - - if (0) put_bytes(tmp, 4, crc32(tmp->buf + 8, tmp->buf_ptr - tmp->buf - 8)); // not including startcode - - put_data(nut->o, bctello(tmp), tmp->buf); - + output_buffer_t * tmp; + int i; + + if (bctello(nut->o) > (1 << 23)) { // main header repetition + i = 23; // ### magic value for header repetition + if (bctello(nut->o) > (1 << 25)) { + for (i = 26; bctello(nut->o) > (1 << i); i++); + i--; + } + if (nut->last_headers < (1 << i)) { + put_headers(nut); + } + } + // distance syncpoints + if (nut->last_syncpoint < nut->last_headers || + bctello(nut->o) - nut->last_syncpoint + fd->len + frame_header(nut, NULL, fd) > nut->max_distance) put_syncpoint(nut); + + tmp = clear_buffer(nut->tmp_buffer); + sc->overhead += frame_header(nut, tmp, fd); sc->total_frames++; sc->tot_size += fd->len; + + put_data(nut->o, bctello(tmp), tmp->buf); + put_data(nut->o, fd->len, buf); for (i = 0; i < nut->stream_count; i++) { if (nut->sc[i].last_dts == -1) continue; @@ -455,35 +468,12 @@ assert(compare_ts(nut, fd->pts, fd->stream, nut->sc[i].last_dts, i) >= 0); } - put_data(nut->o, fd->len, data); sc->last_pts = fd->pts; sc->last_dts = get_dts(sc->sh.decode_delay, sc->pts_cache, fd->pts); sc->sh.max_pts = MAX(sc->sh.max_pts, fd->pts); -} - -void nut_write_frame(nut_context_t * nut, const nut_packet_t * fd, const uint8_t * buf) { - stream_context_t * sc = &nut->sc[fd->stream]; - - if (bctello(nut->o) > (1 << 23)) { // main header repetition - int i = 23; // ### magic value for header repetition - if (bctello(nut->o) > (1 << 25)) { - for (i = 26; bctello(nut->o) > (1 << i); i++); - i--; - } - if (nut->last_headers < (1 << i)) { - put_headers(nut); - } - } - // distance syncpoints - if (ABS((int64_t)fd->pts - (int64_t)sc->last_pts) > sc->max_pts_distance) - fprintf(stderr, "%d - %d > %d \n", (int)fd->pts, (int)sc->last_pts, sc->max_pts_distance); - if (nut->last_syncpoint < nut->last_headers || ABS((int64_t)fd->pts - (int64_t)sc->last_pts) > sc->max_pts_distance || - bctello(nut->o) - nut->last_syncpoint + fd->len + frame_header(nut, fd, NULL) > nut->max_distance) put_syncpoint(nut); - - put_frame(nut, fd, buf); - - if ((fd->flags & NUT_KEY_STREAM_FLAG) && !sc->last_key) sc->last_key = fd->pts + 1; - if (fd->flags & NUT_EOR_STREAM_FLAG) sc->eor = fd->pts + 1; + + if ((fd->flags & NUT_FLAG_KEY) && !sc->last_key) sc->last_key = fd->pts + 1; + if (fd->flags & NUT_FLAG_EOR) sc->eor = fd->pts + 1; else sc->eor = 0; } @@ -502,20 +492,18 @@ { int j, n; - int flag, fields, sflag, timestamp = 0, mul = 1, stream = 0, size, count; + int flag, fields, timestamp = 0, mul = 1, stream = 0, size, count; for(n=i=0; i < 256; n++) { assert(mopts->fti[n].tmp_flag != -1); flag = mopts->fti[n].tmp_flag; fields = mopts->fti[n].tmp_fields; - if (fields > 0) sflag = mopts->fti[n].tmp_sflag; - else sflag = 0; - if (fields > 1) timestamp = mopts->fti[n].tmp_pts; - if (fields > 2) mul = mopts->fti[n].tmp_mul; - if (fields > 3) stream = mopts->fti[n].tmp_stream; - if (fields > 4) size = mopts->fti[n].tmp_size; + if (fields > 0) timestamp = mopts->fti[n].tmp_pts; + if (fields > 1) mul = mopts->fti[n].tmp_mul; + if (fields > 2) stream = mopts->fti[n].tmp_stream; + if (fields > 3) size = mopts->fti[n].tmp_size; else size = 0; - if (fields > 6) count = mopts->fti[n].count; + if (fields > 5) count = mopts->fti[n].count; else count = mul - size; for(j = 0; j < count && i < 256; j++, i++) { @@ -525,7 +513,6 @@ continue; } nut->ft[i].flags = flag; - nut->ft[i].stream_flags = sflag; nut->ft[i].stream_plus1 = stream; nut->ft[i].mul = mul; nut->ft[i].lsb = size + j; Modified: trunk/libnut/nut.h ============================================================================== --- trunk/libnut/nut.h (original) +++ trunk/libnut/nut.h Sat Mar 11 16:35:56 2006 @@ -3,11 +3,13 @@ #define NUT_VERSION 2 -#define NUT_VIDEO_CLASS 0 -#define NUT_AUDIO_CLASS 1 - -#define NUT_KEY_STREAM_FLAG 1 -#define NUT_EOR_STREAM_FLAG 2 +#define NUT_VIDEO_CLASS 0 +#define NUT_AUDIO_CLASS 1 +#define NUT_SUBTITLE_CLASS 2 +#define NUT_USERDATA_CLASS 3 + +#define NUT_FLAG_KEY 1 +#define NUT_FLAG_EOR 2 typedef struct { void * priv; @@ -51,14 +53,13 @@ } nut_stream_header_t; typedef struct { - int tmp_flag; // 1 => use msb, 2 => coded sflags, 4 => invalid, -1 => end + int tmp_flag; // -1 => end int tmp_fields; - int tmp_sflag; // tmp_fields = 1 - int tmp_pts; // tmp_fields = 2 - int tmp_mul; // tmp_fields = 3 - int tmp_stream; // tmp_fields = 4 - int tmp_size; // tmp_fields = 5 - int count; // tmp_fields = 7 (6 is reserved) + int tmp_pts; // tmp_fields = 1 + int tmp_mul; // tmp_fields = 2 + int tmp_stream; // tmp_fields = 3 + int tmp_size; // tmp_fields = 4 + int count; // tmp_fields = 6 (5 is reserved) } frame_table_input_t; typedef struct { Modified: trunk/libnut/priv.h ============================================================================== --- trunk/libnut/priv.h (original) +++ trunk/libnut/priv.h Sat Mar 11 16:35:56 2006 @@ -17,7 +17,13 @@ #define INDEX_STARTCODE (0xDD672F23E64EULL + (((uint64_t)('N'<<8) + 'X')<<48)) #define INFO_STARTCODE (0xAB68B596BA78ULL + (((uint64_t)('N'<<8) + 'I')<<48)) -#define MSB_CODED_FLAG 1 +#define NUT_API_FLAGS 3 + +#define FLAG_SIZE_MSB 32 +#define FLAG_CHECKSUM 64 +#define FLAG_CODED 4096 +#define FLAG_INVALID 8192 + #define STREAM_CODED_FLAG 2 #define INVALID_FLAG 4 @@ -63,13 +69,12 @@ } output_buffer_t; typedef struct { - int flags; - int stream_flags; - int stream_plus1; - int pts_delta; - int lsb; - int mul; - int reserved; + uint16_t flags; + uint16_t mul; + uint16_t lsb; + int16_t pts_delta; + uint8_t reserved; + uint8_t stream_plus1; } frame_table_t; typedef struct { Modified: trunk/nututils/demux_avi.c ============================================================================== --- trunk/nututils/demux_avi.c (original) +++ trunk/nututils/demux_avi.c Sat Mar 11 16:35:56 2006 @@ -417,10 +417,10 @@ if ((avi->stream[0].last_pts % 1000) < N && avi->buf) { p->next_pts = 0; p->len = 5; - p->flags = NUT_KEY_STREAM_FLAG; + p->flags = NUT_FLAG_KEY; p->stream = 2;//2 + (avi->stream[0].last_pts % 100); p->pts = avi->stream[0].last_pts; - if (avi->stream[0].last_pts % 1000) p->flags |= NUT_EOR_STREAM_FLAG; + if (avi->stream[0].last_pts % 1000) p->flags |= NUT_FLAG_EOR; *buf = (void*)avi; free(avi->buf); avi->buf = NULL; @@ -432,7 +432,7 @@ FIXENDIAN32(len); p->next_pts = 0; p->len = len; - p->flags = (avi->index[avi->cur++].dwFlags & 0x10) ? NUT_KEY_STREAM_FLAG : 0; + p->flags = (avi->index[avi->cur++].dwFlags & 0x10) ? NUT_FLAG_KEY : 0; p->stream = s = (fourcc[0] - '0') * 10 + (fourcc[1] - '0'); if (s == 0) { // 1 frame of video int type; @@ -441,8 +441,8 @@ if (stats) fprintf(stats, "%c", type==0?'I':type==1?'P':type==2?'B':'S'); switch (type) { case 0: // I - if (!(p->flags & NUT_KEY_STREAM_FLAG)) printf("Error detected stream %d frame %d\n", s, (int)p->pts); - p->flags |= NUT_KEY_STREAM_FLAG; + if (!(p->flags & NUT_FLAG_KEY)) printf("Error detected stream %d frame %d\n", s, (int)p->pts); + p->flags |= NUT_FLAG_KEY; break; case 3: // S printf("S-Frame %d\n", (int)ftell(avi->in)); @@ -476,8 +476,8 @@ if (samplesize) avi->stream[s].last_pts += p->len / samplesize; else avi->stream[s].last_pts++; - if (!(p->flags & NUT_KEY_STREAM_FLAG)) printf("Error detected stream %d frame %d\n", s, (int)p->pts); - p->flags |= NUT_KEY_STREAM_FLAG; + if (!(p->flags & NUT_FLAG_KEY)) printf("Error detected stream %d frame %d\n", s, (int)p->pts); + p->flags |= NUT_FLAG_KEY; } else { printf("%d %4.4s\n", avi->cur, fourcc); err = 10; Modified: trunk/nututils/demux_ogg.c ============================================================================== --- trunk/nututils/demux_ogg.c (original) +++ trunk/nututils/demux_ogg.c Sat Mar 11 16:35:56 2006 @@ -571,7 +571,7 @@ p->next_pts = 0; p->stream = stream; - p->flags = os->oc->is_key ? os->oc->is_key(os) : NUT_KEY_STREAM_FLAG; + p->flags = !os->oc->is_key || os->oc->is_key(os) ? NUT_FLAG_KEY : 0; p->pts = os->oc->get_pts(os); *buf = os->buf + os->buf_pos; Modified: trunk/nututils/nutmerge.c ============================================================================== --- trunk/nututils/nutmerge.c (original) +++ trunk/nututils/nutmerge.c Sat Mar 11 16:35:56 2006 @@ -17,28 +17,29 @@ frame_table_input_t ft_default[] = { // There must be atleast this safety net: - //{ 3, 3, 0, 0, 1, 0, 0, 0 }, - //{ flag, fields, sflag, pts, mul, stream, size, count } - { 4, 0, 0, 0, 1, 0, 0, 0 }, // invalid 0x00 - { 1, 1, 1, 0, 1, 0, 0, 0 }, // safety net non key frame - { 1, 0, 0, 0, 1, 0, 0, 0 }, // safety net key frame - { 3, 0, 0, 0, 1, 0, 0, 0 }, // one more safety net - { 0, 5, 1, 1, 337, 2, 336, 0 }, // used 82427 times - { 0, 5, 1, 1, 385, 2, 384, 0 }, // used 56044 times - { 0, 5, 0, 2, 7, 1, 6, 0 }, // used 20993 times - { 0, 5, 0, 1, 7, 1, 6, 0 }, // used 10398 times - { 0, 5, 1, 1, 481, 2, 480, 0 }, // used 3527 times - { 0, 5, 1, 1, 289, 2, 288, 0 }, // used 2042 times - { 0, 5, 1, 1, 577, 2, 576, 0 }, // used 1480 times - { 0, 5, 1, 1, 673, 2, 672, 0 }, // used 862 times - { 0, 5, 1, 1, 769, 2, 768, 0 }, // used 433 times - { 0, 5, 1, 1, 961, 2, 960, 0 }, // used 191 times - { 1, 4, 0, 2, 104, 1, 0, 0 }, // "1.2.0" => 14187 - { 1, 4, 0, -1, 42, 1, 0, 0 }, // "1.-1.0" => 5707 - { 1, 4, 0, 1, 83, 1, 0, 0 }, // "1.1.0" => 11159 - { 1, 4, 1, 1, 11, 1, 0, 0 }, // "1.1.1" => 1409 - { 4, 3, 0, 0, 1, 0, 0, 0 }, // invalid 0xFF - { -1, 0, 0, 0, 0, 0, 0, 0 }, // end + //{ 4128, 3, 0, 1, 0, 0, 0 }, + //{ flag, fields, pts, mul, stream, size, count } + { 8192, 0, 0, 1, 0, 0, 0 }, // invalid 0x00 + { 32, 1, 0, 1, 0, 0, 0 }, // safety net non key frame + { 33, 0, 0, 1, 0, 0, 0 }, // safety net key frame + { 4128, 0, 0, 1, 0, 0, 0 }, // one more safety net + { 1, 4, 1, 337, 2, 336, 0 }, // used 82427 times + { 1, 4, 1, 385, 2, 384, 0 }, // used 56044 times + { 0, 4, 2, 7, 1, 6, 0 }, // used 20993 times + { 0, 4, 1, 7, 1, 6, 0 }, // used 10398 times + { 1, 4, 1, 481, 2, 480, 0 }, // used 3527 times + { 1, 4, 1, 289, 2, 288, 0 }, // used 2042 times + { 1, 4, 1, 577, 2, 576, 0 }, // used 1480 times + { 1, 4, 1, 673, 2, 672, 0 }, // used 862 times + { 1, 4, 1, 769, 2, 768, 0 }, // used 433 times + { 1, 4, 1, 961, 2, 960, 0 }, // used 191 times + { 32, 3, 2, 101, 1, 0, 0 }, // "1.2.0" => 14187 + { 32, 3, -1, 41, 1, 0, 0 }, // "1.-1.0" => 5707 + { 32, 3, 1, 81, 1, 0, 0 }, // "1.1.0" => 11159 + { 33, 3, 1, 11, 1, 0, 0 }, // "1.1.1" => 1409 + { 97, 3, 0, 6, 1, 0, 0 }, // checksum for video + { 8192, 2, 0, 1, 0, 0, 0 }, // invalid 0xFF + { -1, 0, 0, 0, 0, 0, 0 }, // end }; int main(int argc, char * argv []) {
participants (1)
-
syncmail@mplayerhq.hu