[NUT-devel] [nut]: r205 - trunk/libnut/demuxer.c
ods15
subversion at mplayerhq.hu
Wed Nov 15 08:17:55 CET 2006
Author: ods15
Date: Wed Nov 15 08:17:54 2006
New Revision: 205
Modified:
trunk/libnut/demuxer.c
Log:
search for first syncpoint after main headers
inform if index was read successfully after all with the read_index option
Modified: trunk/libnut/demuxer.c
==============================================================================
--- trunk/libnut/demuxer.c (original)
+++ trunk/libnut/demuxer.c Wed Nov 15 08:17:54 2006
@@ -805,11 +805,11 @@
int nut_read_headers(nut_context_t * nut, nut_stream_header_t * s [], nut_info_packet_t * info []) {
int i, err = 0;
+ uint64_t tmp;
*s = NULL;
if (!nut->seek_status) { // we already have headers, we were called just for index
if (!nut->last_headers) {
off_t start = bctello(nut->i);
- uint64_t tmp;
if (start < strlen(ID_STRING) + 1) {
int n = strlen(ID_STRING) + 1 - start;
ERROR(ready_read_buf(nut->i, n) < n, buf_eof(nut->i));
@@ -838,7 +838,6 @@
}
for (i = 0; i < nut->stream_count; i++) {
- uint64_t tmp;
int j;
CHECK(get_bytes(nut->i, 8, &tmp));
while (tmp != STREAM_STARTCODE) {
@@ -856,7 +855,6 @@
}
}
if (info) {
- uint64_t tmp;
CHECK(get_bytes(nut->i, 8, &tmp));
while (tmp == INFO_STARTCODE) {
nut->info_count++;
@@ -871,7 +869,6 @@
nut->i->buf_ptr -= 8;
}
if (nut->dopts.read_index) {
- uint64_t tmp;
CHECK(get_bytes(nut->i, 8, &tmp));
while (tmp >> 56 == 'N') {
if (tmp == INDEX_STARTCODE || tmp == SYNCPOINT_STARTCODE) break;
@@ -884,7 +881,7 @@
}
}
- if (nut->dopts.read_index) {
+ if (nut->dopts.read_index & 1) {
uint64_t idx_ptr;
if (nut->seek_status <= 1) {
if (nut->seek_status == 0) {
@@ -901,12 +898,30 @@
nut->seek_status = 2;
// only EAGAIN from get_index is interesting
if ((err = get_index(nut)) == 2) goto err_out;
+ if (err) nut->dopts.read_index = 0;
+ else nut->dopts.read_index = 2;
err = 0;
}
- nut->seek_status = 0;
if (nut->before_seek) seek_buf(nut->i, nut->before_seek, SEEK_SET);
nut->before_seek = 0;
}
+
+ CHECK(get_bytes(nut->i, 8, &tmp));
+ while (tmp >> 56 == 'N') {
+ if (tmp == SYNCPOINT_STARTCODE) break;
+ if ((err = get_header(nut->i, NULL)) == 2) goto err_out;
+ if (err) break;
+ CHECK(get_bytes(nut->i, 8, &tmp));
+ }
+ nut->i->buf_ptr -= 8;
+ if (err || tmp != SYNCPOINT_STARTCODE) {
+ nut->seek_status = 1; // enter error mode
+ nut->i->buf_ptr = nut->i->buf; // rewind as much as possible
+ err = 0;
+ } else {
+ nut->seek_status = 0;
+ }
+
*s = nut->alloc->malloc(sizeof(nut_stream_header_t) * (nut->stream_count + 1));
ERROR(!*s, -ERR_OUT_OF_MEM);
for (i = 0; i < nut->stream_count; i++) (*s)[i] = nut->sc[i].sh;
More information about the NUT-devel
mailing list