[NUT] (ods15): r92 - in /trunk/libnut: demuxer.c muxer.c

Author: ods15 Date: Sat Mar 11 13:49:12 2006 New Revision: 92 Log: sync to spec, syncpoints are their own headers some more asserts small bugfix in demuxer, ptr could be invalid in find_syncpoint less waste in demuxer with no unnecessary memcpy and malloc Modified: trunk/libnut/demuxer.c trunk/libnut/muxer.c Modified: trunk/libnut/demuxer.c ============================================================================== --- trunk/libnut/demuxer.c (original) +++ trunk/libnut/demuxer.c Sat Mar 11 13:49:12 2006 @@ -77,8 +77,7 @@ return bc->buf + start; } -static input_buffer_t * new_mem_buffer() { - input_buffer_t * bc = malloc(sizeof(input_buffer_t)); +static input_buffer_t * new_mem_buffer(input_buffer_t * bc) { bc->read_len = 0; bc->write_len = 0; bc->is_mem = 1; @@ -89,7 +88,7 @@ } static input_buffer_t * new_input_buffer(nut_input_stream_t isc) { - input_buffer_t * bc = new_mem_buffer(); + input_buffer_t * bc = new_mem_buffer(malloc(sizeof(input_buffer_t))); bc->is_mem = 0; bc->isc = isc; bc->file_pos = isc.file_pos; @@ -102,6 +101,7 @@ } static void free_buffer(input_buffer_t * bc) { + assert(!bc->is_mem); if (!bc) return; free(bc->buf); free(bc); @@ -210,19 +210,15 @@ if (out) { assert(out->is_mem); assert(out->buf == out->buf_ptr); - if (out->write_len < forward_ptr - 4) { - out->write_len = forward_ptr - 4; - out->buf_ptr = out->buf = realloc(out->buf, out->write_len); - } - memcpy(out->buf, in->buf_ptr - forward_ptr, forward_ptr - 4); - out->read_len = forward_ptr - 4; // not including checksum + out->buf_ptr = out->buf = in->buf_ptr - forward_ptr; + out->write_len = out->read_len = forward_ptr - 4; // not including checksum } err_out: return err; } static int get_main_header(nut_context_t * nut) { - input_buffer_t * tmp = new_mem_buffer(); + 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; @@ -270,12 +266,11 @@ } } err_out: - free_buffer(tmp); return err; } static int get_stream_header(nut_context_t * nut, int id) { - input_buffer_t * tmp = new_mem_buffer(); + input_buffer_t itmp, * tmp = new_mem_buffer(&itmp); stream_context_t * sc = &nut->sc[id]; int i, err = 0; uint64_t a; @@ -311,7 +306,6 @@ break; } err_out: - free_buffer(tmp); return err; } @@ -372,11 +366,14 @@ int err = 0; syncpoint_t s; int after_seek = nut->last_syncpoint ? 0 : 1; + input_buffer_t itmp, * tmp = new_mem_buffer(&itmp); nut->last_syncpoint = s.pos = bctello(nut->i) - 8; - GET_V(nut->i, s.pts); - GET_V(nut->i, s.back_ptr); + CHECK(get_header(nut->i, tmp)); + + GET_V(tmp, s.pts); + GET_V(tmp, s.back_ptr); s.back_ptr = (s.back_ptr * 8 + 7)<<1; set_global_pts(nut, s.pts); @@ -404,7 +401,7 @@ } static int get_index(nut_context_t * nut) { - input_buffer_t * tmp = new_mem_buffer(); + input_buffer_t itmp, * tmp = new_mem_buffer(&itmp); int err = 0; syncpoint_list_t * sl = &nut->syncpoints; uint64_t x; @@ -473,7 +470,6 @@ fprintf(stderr, "NUT index read successfully, %d syncpoints\n", sl->len); err_out: - free_buffer(tmp); return err; } @@ -496,37 +492,13 @@ if (tmp == 'N') { CHECK(get_bytes(nut->i, 7, &tmp)); tmp |= (uint64_t)'N' << 56; - if (tmp == MAIN_STARTCODE) { - int i; - GET_V(nut->i, pd->len); - CHECK(skip_buffer(nut->i, pd->len)); - for (i = 0; i < nut->stream_count; i++) { - CHECK(get_bytes(nut->i, 8, &tmp)); - ERROR(tmp != STREAM_STARTCODE, -ERR_NOSTREAM_STARTCODE); - GET_V(nut->i, pd->len); - CHECK(skip_buffer(nut->i, pd->len)); - } - CHECK(get_bytes(nut->i, 8, &tmp)); - while (tmp == INFO_STARTCODE) { - GET_V(nut->i, pd->len); - CHECK(skip_buffer(nut->i, pd->len)); - CHECK(get_bytes(nut->i, 8, &tmp)); - } - if (tmp == INDEX_STARTCODE) { - GET_V(nut->i, pd->len); - CHECK(skip_buffer(nut->i, pd->len)); - CHECK(get_bytes(nut->i, 8, &tmp)); - } - ERROR(tmp != SYNCPOINT_STARTCODE && tmp != MAIN_STARTCODE, -ERR_NO_HEADERS); - nut->i->buf_ptr -= 8; - return get_packet(nut, pd, saw_syncpoint); - } else if (tmp == SYNCPOINT_STARTCODE) { + if (tmp == SYNCPOINT_STARTCODE) { after_sync = bctello(nut->i); CHECK(get_syncpoint(nut)); CHECK(get_bytes(nut->i, 1, &tmp)); } else { - nut->i->buf_ptr -= 7; - tmp = 'N'; + CHECK(get_header(nut->i, NULL)); + return get_packet(nut, pd, saw_syncpoint); } } @@ -560,7 +532,7 @@ for (i = 0; i < nut->ft[tmp].reserved; i++) { int scrap; GET_V(nut->i, scrap); } - if (after_sync) { + if (0) { uint64_t checksum; off_t pos = bctello(nut->i); CHECK(get_bytes(nut->i, 4, &checksum)); @@ -599,7 +571,7 @@ int read; int err = 0; uint64_t tmp; - uint8_t * ptr = NULL; + off_t ptr = 0; assert(!backwards || !stop); // can't have both if (backwards) seek_buf(nut->i, -nut->max_distance, SEEK_CUR); @@ -614,32 +586,22 @@ tmp = (tmp << 8) | *(nut->i->buf_ptr++); if (tmp != SYNCPOINT_STARTCODE) continue; if (res) { - int i, scrap; + input_buffer_t itmp, * tmp = new_mem_buffer(&itmp); res->pos = bctello(nut->i) - 8; - GET_V(nut->i, res->pts); - GET_V(nut->i, tmp); - res->back_ptr = (tmp * 8 + 7) << 1; - - CHECK(get_bytes(nut->i, 1, &tmp)); - if (!nut->ft[tmp].stream_plus1) GET_V(nut->i, scrap); - if (!nut->ft[tmp].pts_delta) GET_V(nut->i, scrap); - if (nut->ft[tmp].flags & MSB_CODED_FLAG) GET_V(nut->i, scrap); - if (nut->ft[tmp].flags & STREAM_CODED_FLAG) GET_V(nut->i, scrap); - for (i = 0; i < nut->ft[tmp].reserved; i++) GET_V(nut->i, scrap); - CHECK(get_bytes(nut->i, 4, &tmp)); - - if (tmp != crc32(nut->i->buf_ptr - (bctello(nut->i) - res->pos - 8), bctello(nut->i) - 4 - res->pos - 8)) { - tmp = 0; - nut->i->buf_ptr -= bctello(nut->i) - res->pos - 8; // rewind to right after the startcode - continue; - } + + if ((err = get_header(nut->i, tmp)) == 2) goto err_out; + if (err) { err = 0; continue; } + + GET_V(tmp, res->pts); + GET_V(tmp, res->back_ptr); + res->back_ptr = (res->back_ptr * 8 + 7) << 1; } if (!backwards) return 0; - else ptr = nut->i->buf_ptr; + else ptr = bctello(nut->i); } if (ptr) { - nut->i->buf_ptr = ptr; + nut->i->buf_ptr -= bctello(nut->i) - ptr; return 0; } Modified: trunk/libnut/muxer.c ============================================================================== --- trunk/libnut/muxer.c (original) +++ trunk/libnut/muxer.c Sat Mar 11 13:49:12 2006 @@ -57,6 +57,7 @@ } static output_buffer_t * clear_buffer(output_buffer_t * bc) { + assert(bc->is_mem); bc->buf_ptr = bc->buf; return bc; } @@ -258,7 +259,8 @@ for (i = 0; i < nut->info_count; i++) put_info(nut, &nut->info[i]); } -static void put_syncpoint(nut_context_t * nut, output_buffer_t * bc) { +static void put_syncpoint(nut_context_t * nut) { + output_buffer_t * tmp = clear_buffer(nut->tmp_buffer); int i; uint64_t pts = 0; int stream = 0; @@ -309,11 +311,12 @@ if (nut->sc[i].eor) nut->sc[i].eor = -1; // so we know to ignore this stream in future syncpoints } - put_bytes(bc, 8, SYNCPOINT_STARTCODE); - put_v(bc, pts * nut->stream_count + stream); - put_v(bc, back_ptr); - - nut->sync_overhead += bctello(bc) + 4/*checksum*/; + put_v(tmp, pts * nut->stream_count + stream); + put_v(tmp, back_ptr); + + put_header(nut->o, tmp, nut->tmp_buffer2, SYNCPOINT_STARTCODE, 0); + + nut->sync_overhead += bctello(tmp) + bctello(nut->tmp_buffer2); } static void put_index(nut_context_t * nut) { @@ -414,42 +417,31 @@ return size; } -static int put_frame_header(nut_context_t * nut, output_buffer_t * bc, const nut_packet_t * fd) { +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); stream_context_t * sc = &nut->sc[fd->stream]; int ftnum = -1, coded_pts, pts_delta = fd->pts - sc->last_pts; - int size; + 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); - size = frame_header(nut, fd, &ftnum); - - put_bytes(bc, 1, ftnum); // frame_code - - if (!nut->ft[ftnum].stream_plus1) put_v(bc, fd->stream); - if (!nut->ft[ftnum].pts_delta) put_v(bc, coded_pts); + 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(bc, (fd->len - nut->ft[ftnum].lsb) / nut->ft[ftnum].mul); + put_v(tmp, (fd->len - nut->ft[ftnum].lsb) / nut->ft[ftnum].mul); if (nut->ft[ftnum].flags & STREAM_CODED_FLAG) - put_v(bc, (fd->flags & 3) ^ nut->ft[ftnum].stream_flags); - - return size; -} - -static void put_frame(nut_context_t * nut, const nut_packet_t * fd, const uint8_t * data, int write_syncpoint) { - output_buffer_t * tmp = clear_buffer(nut->tmp_buffer); - stream_context_t * sc = &nut->sc[fd->stream]; - int i; - - if (write_syncpoint) put_syncpoint(nut, tmp); - - sc->overhead += put_frame_header(nut, tmp, fd); - - put_data(nut->o, tmp->buf_ptr - tmp->buf, tmp->buf); - - if (write_syncpoint) put_bytes(nut->o, 4, crc32(tmp->buf + 8, tmp->buf_ptr - tmp->buf - 8)); // not including startcode + 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); sc->total_frames++; sc->tot_size += fd->len; @@ -471,7 +463,6 @@ 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 write_syncpoint = 0; if (bctello(nut->o) > (1 << 23)) { // main header repetition int i = 23; // ### magic value for header repetition @@ -487,9 +478,9 @@ 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) write_syncpoint = 1; - - put_frame(nut, fd, buf, write_syncpoint); + 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;
participants (1)
-
syncmail@mplayerhq.hu