|
|
|
@@ -682,6 +682,20 @@ fail: |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
static int nut_read_close(AVFormatContext *s) |
|
|
|
{ |
|
|
|
NUTContext *nut = s->priv_data; |
|
|
|
int i; |
|
|
|
|
|
|
|
av_freep(&nut->time_base); |
|
|
|
av_freep(&nut->stream); |
|
|
|
ff_nut_free_sp(nut); |
|
|
|
for (i = 1; i < nut->header_count; i++) |
|
|
|
av_freep(&nut->header[i]); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int nut_read_header(AVFormatContext *s) |
|
|
|
{ |
|
|
|
NUTContext *nut = s->priv_data; |
|
|
|
@@ -697,7 +711,7 @@ static int nut_read_header(AVFormatContext *s) |
|
|
|
pos = find_startcode(bc, MAIN_STARTCODE, pos) + 1; |
|
|
|
if (pos < 0 + 1) { |
|
|
|
av_log(s, AV_LOG_ERROR, "No main startcode found.\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
} while (decode_main_header(nut) < 0); |
|
|
|
|
|
|
|
@@ -707,7 +721,7 @@ static int nut_read_header(AVFormatContext *s) |
|
|
|
pos = find_startcode(bc, STREAM_STARTCODE, pos) + 1; |
|
|
|
if (pos < 0 + 1) { |
|
|
|
av_log(s, AV_LOG_ERROR, "Not all stream headers found.\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
goto fail; |
|
|
|
} |
|
|
|
if (decode_stream_header(nut) >= 0) |
|
|
|
initialized_stream_count++; |
|
|
|
@@ -721,7 +735,7 @@ static int nut_read_header(AVFormatContext *s) |
|
|
|
|
|
|
|
if (startcode == 0) { |
|
|
|
av_log(s, AV_LOG_ERROR, "EOF before video frames\n"); |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
goto fail; |
|
|
|
} else if (startcode == SYNCPOINT_STARTCODE) { |
|
|
|
nut->next_startcode = startcode; |
|
|
|
break; |
|
|
|
@@ -744,6 +758,11 @@ static int nut_read_header(AVFormatContext *s) |
|
|
|
ff_metadata_conv_ctx(s, NULL, ff_nut_metadata_conv); |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
fail: |
|
|
|
nut_read_close(s); |
|
|
|
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
} |
|
|
|
|
|
|
|
static int decode_frame_header(NUTContext *nut, int64_t *pts, int *stream_id, |
|
|
|
@@ -1018,20 +1037,6 @@ static int read_seek(AVFormatContext *s, int stream_index, |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int nut_read_close(AVFormatContext *s) |
|
|
|
{ |
|
|
|
NUTContext *nut = s->priv_data; |
|
|
|
int i; |
|
|
|
|
|
|
|
av_freep(&nut->time_base); |
|
|
|
av_freep(&nut->stream); |
|
|
|
ff_nut_free_sp(nut); |
|
|
|
for (i = 1; i < nut->header_count; i++) |
|
|
|
av_freep(&nut->header[i]); |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
AVInputFormat ff_nut_demuxer = { |
|
|
|
.name = "nut", |
|
|
|
.long_name = NULL_IF_CONFIG_SMALL("NUT"), |
|
|
|
|