[NUT-devel] [NUT] (ods15): r98 - /trunk/nututils/nutindex.c
syncmail at mplayerhq.hu
syncmail at mplayerhq.hu
Sat Mar 11 20:24:03 CET 2006
Author: ods15
Date: Sat Mar 11 20:24:03 2006
New Revision: 98
Log:
nutindex:
sync to spec, /16 not /8
forward_ptr have their own checksum
optimizations in memory
Modified:
trunk/nututils/nutindex.c
Modified: trunk/nututils/nutindex.c
==============================================================================
--- trunk/nututils/nutindex.c (original)
+++ trunk/nututils/nutindex.c Sat Mar 11 20:24:03 2006
@@ -212,36 +212,49 @@
}
static int get_data(input_buffer_t * bc, int len, uint8_t * buf) {
- int tmp;
- tmp = ready_read_buf(bc, len);
- len = MIN(len, tmp);
- memcpy(buf, bc->buf_ptr, len);
- bc->buf_ptr += len;
+ int tmp = MIN(len, bc->read_len - (bc->buf_ptr - bc->buf));
+ if (tmp) {
+ memcpy(buf, bc->buf_ptr, tmp);
+ bc->buf_ptr += tmp;
+ len -= tmp;
+ }
+ if (len) {
+ int read = fread(buf + tmp, 1, len, bc->in);
+ bc->file_pos += read;
+ len -= read;
+ }
+ flush_buf(bc);
return len;
}
#define CHECK(expr) do { int _a; if ((_a = (expr))) return _a; } while(0)
#define GET_V(bc, v) do { uint64_t _tmp; CHECK(get_v((bc), &_tmp)); (v) = _tmp; } while(0)
+static int get_header(input_buffer_t * in) {
+ off_t start = bctello(in) - 8; // startcode
+ int forward_ptr;
+
+ GET_V(in, forward_ptr);
+ if (forward_ptr > 4096) {
+ CHECK(skip_buffer(in, 4)); // header_checksum
+ if (crc32(in->buf_ptr - (bctello(in) - start), bctello(in) - start)) return 3;
+ }
+
+ CHECK(skip_buffer(in, forward_ptr));
+ if (crc32(in->buf_ptr - forward_ptr, forward_ptr)) return 3;
+ return 0;
+}
+
static int read_headers(input_buffer_t * in) {
int len = strlen(ID_STRING) + 1;
- char str[len];
uint64_t tmp;
- if (get_data(in, len, str) != len) return 1;
- if (memcmp(str, ID_STRING, len)) return 1;
+ assert(in->buf == in->buf_ptr);
+ if (ready_read_buf(in, len) < len) return 1;
+ if (memcmp(in->buf_ptr, ID_STRING, len)) return 1;
+ in->buf_ptr += len;
CHECK(get_bytes(in, 8, &tmp));
- if (tmp != MAIN_STARTCODE) return 1;
- GET_V(in, len);
- CHECK(skip_buffer(in, len));
- CHECK(get_bytes(in, 8, &tmp));
- while (tmp == STREAM_STARTCODE) {
- GET_V(in, len);
- CHECK(skip_buffer(in, len));
- CHECK(get_bytes(in, 8, &tmp));
- }
- while (tmp == INFO_STARTCODE) {
- GET_V(in, len);
- CHECK(skip_buffer(in, len));
+ while (tmp != INDEX_STARTCODE && tmp != SYNCPOINT_STARTCODE) {
+ CHECK(get_header(in));
CHECK(get_bytes(in, 8, &tmp));
}
if (tmp == INDEX_STARTCODE) return 2;
@@ -252,6 +265,7 @@
static int find_copy_index(input_buffer_t * in, output_buffer_t * out, off_t * end) {
uint64_t tmp;
uint64_t idx_len;
+ uint64_t max_pts, syncpoints;
int new_idx_len, forward_ptr;
int i, padding;
assert(out->is_mem);
@@ -265,47 +279,45 @@
if (tmp != INDEX_STARTCODE) return 2;
GET_V(in, forward_ptr);
-
- GET_V(in, tmp); put_v(out, tmp); // max_pts
- GET_V(in, tmp); put_v(out, tmp); // syncpoints
+ if (forward_ptr > 4) { // checksum
+ skip_buffer(in, 4);
+ if (crc32(in->buf, in->buf_ptr - in->buf)) return 4;
+ }
+
+ GET_V(in, max_pts);
+ GET_V(in, syncpoints);
GET_V(in, tmp); // first syncpoint position
- new_idx_len = ((idx_len + 7)/8)*8;
+ new_idx_len = ((idx_len + 15)/16)*16;
// paranoia, this should either iterate once or not at all
- while ( (v_len(tmp + new_idx_len/8 ) - v_len(tmp )) +
+ while ( (v_len(tmp + new_idx_len/16 ) - v_len(tmp )) +
(v_len(forward_ptr + new_idx_len-idx_len) - v_len(forward_ptr))
- > new_idx_len - idx_len) new_idx_len += 8;
+ > new_idx_len - idx_len) new_idx_len += 16;
+
+ put_bytes(out, 8, INDEX_STARTCODE);
+ put_v(out, forward_ptr + new_idx_len-idx_len);
+ if (forward_ptr + new_idx_len-idx_len > 4096) put_bytes(out, 4, crc32(out->buf, bctello(out)));
+ put_v(out, max_pts);
+ put_v(out, syncpoints);
padding = new_idx_len - idx_len;
- padding -= (v_len(tmp + new_idx_len/8) - v_len(tmp));
+ padding -= (v_len(tmp + new_idx_len/16) - v_len(tmp));
padding -= (v_len(forward_ptr + new_idx_len-idx_len) - v_len(forward_ptr)); // extreme paranoia, this will be zero
for (i = 0; i < padding; i++) put_bytes(out, 1, 0x80);
- put_v(out, tmp + new_idx_len/8); // the new first syncpoint position
- printf("%d => %d (%d)\n", (int)tmp, (int)(tmp + new_idx_len/8), new_idx_len);
+ put_v(out, tmp + new_idx_len/16); // the new first syncpoint position
+ printf("%d => %d (%d)\n", (int)tmp, (int)(tmp + new_idx_len/16), new_idx_len);
idx_len = (in->filesize - 12) - bctello(in); // from where we are, until the index_ptr and checksum, copy everything
- if (ready_read_buf(in, idx_len) < idx_len) return 1;
ready_write_buf(out, idx_len);
- memcpy(out->buf_ptr, in->buf_ptr, idx_len);
+ if (get_data(in, idx_len, out->buf_ptr)) return 1;
out->buf_ptr += idx_len;
- in->buf_ptr += idx_len;
-
- forward_ptr = out->buf_ptr - out->buf;
- forward_ptr += 4 + 8; // checksum and index_ptr
- put_bytes(out, 8, 8 + v_len(forward_ptr) + forward_ptr); // index_ptr
- put_bytes(out, 4, crc32(out->buf, out->buf_ptr - out->buf)); // checksum
-
- return 0;
-}
-
-static void put_index(output_buffer_t * bc, output_buffer_t * tmp) {
- assert(tmp->is_mem);
-
- put_bytes(bc, 8, INDEX_STARTCODE);
- put_v(bc, tmp->buf_ptr - tmp->buf); // forward_ptr
- put_data(bc, tmp->buf_ptr - tmp->buf, tmp->buf);
+
+ put_bytes(out, 8, new_idx_len); // index_ptr
+ put_bytes(out, 4, crc32(out->buf, bctello(out))); // checksum
+
+ return 0;
}
int main(int argc, char * argv[]) {
@@ -325,8 +337,8 @@
seek_buf(in, 0, SEEK_SET);
CHECK(read_headers(in));
- put_data(out, bctello(in), in->buf);
- put_index(out, mem);
+ put_data(out, bctello(in), in->buf); // write headers
+ put_data(out, bctello(mem), mem->buf); // write index
// copy all data
while (bctello(in) < end) {
@@ -337,7 +349,7 @@
flush_buf(in);
printf("%d\r", (int)bctello(in));
}
- put_index(out, mem);
+ put_data(out, bctello(mem), mem->buf); // write index
free_buffer(in);
free_out_buffer(out);
More information about the NUT-devel
mailing list