@ -33,7 +33,8 @@
# define NUT_MAX_STREAMS 256 /* arbitrary sanity check value */
static int get_str ( AVIOContext * bc , char * string , unsigned int maxlen ) {
static int get_str ( AVIOContext * bc , char * string , unsigned int maxlen )
{
unsigned int len = ffio_read_varlen ( bc ) ;
if ( len & & maxlen )
@ -52,40 +53,56 @@ static int get_str(AVIOContext *bc, char *string, unsigned int maxlen){
return 0 ;
}
static int64_t get_s ( AVIOContext * bc ) {
static int64_t get_s ( AVIOContext * bc )
{
int64_t v = ffio_read_varlen ( bc ) + 1 ;
if ( v & 1 ) return - ( v > > 1 ) ;
else return ( v > > 1 ) ;
if ( v & 1 )
return - ( v > > 1 ) ;
else
return ( v > > 1 ) ;
}
static uint64_t get_fourcc ( AVIOContext * bc ) {
static uint64_t get_fourcc ( AVIOContext * bc )
{
unsigned int len = ffio_read_varlen ( bc ) ;
if ( len = = 2 ) return avio_rl16 ( bc ) ;
else if ( len = = 4 ) return avio_rl32 ( bc ) ;
else return - 1 ;
if ( len = = 2 )
return avio_rl16 ( bc ) ;
else if ( len = = 4 )
return avio_rl32 ( bc ) ;
else
return - 1 ;
}
# ifdef TRACE
static inline uint64_t get_v_trace ( AVIOContext * bc , char * file , char * func , int line ) {
static inline uint64_t get_v_trace ( AVIOContext * bc , char * file ,
char * func , int line )
{
uint64_t v = ffio_read_varlen ( bc ) ;
av_log ( NULL , AV_LOG_DEBUG , " get_v %5 " PRId64 " / % " PRIX64 " in %s %s:%d \n " , v , v , file , func , line ) ;
av_log ( NULL , AV_LOG_DEBUG , " get_v %5 " PRId64 " / % " PRIX64 " in %s %s:%d \n " ,
v , v , file , func , line ) ;
return v ;
}
static inline int64_t get_s_trace ( AVIOContext * bc , char * file , char * func , int line ) {
static inline int64_t get_s_trace ( AVIOContext * bc , char * file ,
char * func , int line )
{
int64_t v = get_s ( bc ) ;
av_log ( NULL , AV_LOG_DEBUG , " get_s %5 " PRId64 " / % " PRIX64 " in %s %s:%d \n " , v , v , file , func , line ) ;
av_log ( NULL , AV_LOG_DEBUG , " get_s %5 " PRId64 " / % " PRIX64 " in %s %s:%d \n " ,
v , v , file , func , line ) ;
return v ;
}
static inline uint64_t get_vb_trace ( AVIOContext * bc , char * file , char * func , int line ) {
static inline uint64_t get_vb_trace ( AVIOContext * bc , char * file ,
char * func , int line )
{
uint64_t v = get_vb ( bc ) ;
av_log ( NULL , AV_LOG_DEBUG , " get_vb %5 " PRId64 " / % " PRIX64 " in %s %s:%d \n " , v , v , file , func , line ) ;
av_log ( NULL , AV_LOG_DEBUG , " get_vb %5 " PRId64 " / % " PRIX64 " in %s %s:%d \n " ,
v , v , file , func , line ) ;
return v ;
}
# define ffio_read_varlen(bc) get_v_trace(bc, __FILE__, __PRETTY_FUNCTION__, __LINE__)
@ -93,7 +110,8 @@ static inline uint64_t get_vb_trace(AVIOContext *bc, char *file, char *func, int
# define get_vb(bc) get_vb_trace(bc, __FILE__, __PRETTY_FUNCTION__, __LINE__)
# endif
static int get_packetheader ( NUTContext * nut , AVIOContext * bc , int calculate_checksum , uint64_t startcode )
static int get_packetheader ( NUTContext * nut , AVIOContext * bc ,
int calculate_checksum , uint64_t startcode )
{
int64_t size ;
// start = avio_tell(bc) - 8;
@ -113,12 +131,14 @@ static int get_packetheader(NUTContext *nut, AVIOContext *bc, int calculate_chec
return size ;
}
static uint64_t find_any_startcode ( AVIOContext * bc , int64_t pos ) {
static uint64_t find_any_startcode ( AVIOContext * bc , int64_t pos )
{
uint64_t state = 0 ;
if ( pos > = 0 )
avio_seek ( bc , pos , SEEK_SET ) ; //note, this may fail if the stream is not seekable, but that should not matter, as in this case we simply start where we currently are
/* Note, this may fail if the stream is not seekable, but that should
* not matter , as in this case we simply start where we currently are */
avio_seek ( bc , pos , SEEK_SET ) ;
while ( ! bc - > eof_reached ) {
state = ( state < < 8 ) | avio_r8 ( bc ) ;
if ( ( state > > 56 ) ! = ' N ' )
@ -142,7 +162,8 @@ static uint64_t find_any_startcode(AVIOContext *bc, int64_t pos){
* @ param pos the start position of the search , or - 1 if the current position
* @ return the position of the startcode or - 1 if not found
*/
static int64_t find_startcode ( AVIOContext * bc , uint64_t code , int64_t pos ) {
static int64_t find_startcode ( AVIOContext * bc , uint64_t code , int64_t pos )
{
for ( ; ; ) {
uint64_t startcode = find_any_startcode ( bc , pos ) ;
if ( startcode = = code )
@ -153,7 +174,8 @@ static int64_t find_startcode(AVIOContext *bc, uint64_t code, int64_t pos){
}
}
static int nut_probe ( AVProbeData * p ) {
static int nut_probe ( AVProbeData * p )
{
int i ;
uint64_t code = 0 ;
@ -173,7 +195,8 @@ static int nut_probe(AVProbeData *p){
} \
dst = tmp ;
static int skip_reserved ( AVIOContext * bc , int64_t pos ) {
static int skip_reserved ( AVIOContext * bc , int64_t pos )
{
pos - = avio_tell ( bc ) ;
if ( pos < 0 ) {
avio_seek ( bc , pos , SEEK_CUR ) ;
@ -185,12 +208,14 @@ static int skip_reserved(AVIOContext *bc, int64_t pos){
}
}
static int decode_main_header ( NUTContext * nut ) {
static int decode_main_header ( NUTContext * nut )
{
AVFormatContext * s = nut - > avf ;
AVIOContext * bc = s - > pb ;
uint64_t tmp , end ;
unsigned int stream_count ;
int i , j , tmp_stream , tmp_mul , tmp_pts , tmp_size , count , tmp_res , tmp_head_idx ;
int i , j , count ;
int tmp_stream , tmp_mul , tmp_pts , tmp_size , tmp_res , tmp_head_idx ;
end = get_packetheader ( nut , bc , 1 , MAIN_STARTCODE ) ;
end + = avio_tell ( bc ) ;
@ -222,17 +247,29 @@ static int decode_main_header(NUTContext *nut){
for ( i = 0 ; i < 256 ; ) {
int tmp_flags = ffio_read_varlen ( bc ) ;
int tmp_fields = ffio_read_varlen ( bc ) ;
if ( tmp_fields > 0 ) tmp_pts = get_s ( bc ) ;
if ( tmp_fields > 1 ) tmp_mul = ffio_read_varlen ( bc ) ;
if ( tmp_fields > 2 ) tmp_stream = ffio_read_varlen ( bc ) ;
if ( tmp_fields > 3 ) tmp_size = ffio_read_varlen ( bc ) ;
else tmp_size = 0 ;
if ( tmp_fields > 4 ) tmp_res = ffio_read_varlen ( bc ) ;
else tmp_res = 0 ;
if ( tmp_fields > 5 ) count = ffio_read_varlen ( bc ) ;
else count = tmp_mul - tmp_size ;
if ( tmp_fields > 6 ) get_s ( bc ) ;
if ( tmp_fields > 7 ) tmp_head_idx = ffio_read_varlen ( bc ) ;
if ( tmp_fields > 0 )
tmp_pts = get_s ( bc ) ;
if ( tmp_fields > 1 )
tmp_mul = ffio_read_varlen ( bc ) ;
if ( tmp_fields > 2 )
tmp_stream = ffio_read_varlen ( bc ) ;
if ( tmp_fields > 3 )
tmp_size = ffio_read_varlen ( bc ) ;
else
tmp_size = 0 ;
if ( tmp_fields > 4 )
tmp_res = ffio_read_varlen ( bc ) ;
else
tmp_res = 0 ;
if ( tmp_fields > 5 )
count = ffio_read_varlen ( bc ) ;
else
count = tmp_mul - tmp_size ;
if ( tmp_fields > 6 )
get_s ( bc ) ;
if ( tmp_fields > 7 )
tmp_head_idx = ffio_read_varlen ( bc ) ;
while ( tmp_fields - - > 8 )
ffio_read_varlen ( bc ) ;
@ -286,14 +323,14 @@ static int decode_main_header(NUTContext *nut){
}
nut - > stream = av_mallocz ( sizeof ( StreamContext ) * stream_count ) ;
for ( i = 0 ; i < stream_count ; i + + ) {
for ( i = 0 ; i < stream_count ; i + + )
avformat_new_stream ( s , NULL ) ;
}
return 0 ;
}
static int decode_stream_header ( NUTContext * nut ) {
static int decode_stream_header ( NUTContext * nut )
{
AVFormatContext * s = nut - > avf ;
AVIOContext * bc = s - > pb ;
StreamContext * stc ;
@ -306,7 +343,6 @@ static int decode_stream_header(NUTContext *nut){
GET_V ( stream_id , tmp < s - > nb_streams & & ! nut - > stream [ tmp ] . time_base ) ;
stc = & nut - > stream [ stream_id ] ;
st = s - > streams [ stream_id ] ;
if ( ! st )
return AVERROR ( ENOMEM ) ;
@ -314,12 +350,14 @@ static int decode_stream_header(NUTContext *nut){
class = ffio_read_varlen ( bc ) ;
tmp = get_fourcc ( bc ) ;
st - > codec - > codec_tag = tmp ;
switch ( class )
{
switch ( class ) {
case 0 :
st - > codec - > codec_type = AVMEDIA_TYPE_VIDEO ;
st - > codec - > codec_id = av_codec_get_id (
( const AVCodecTag * const [ ] ) { ff_codec_bmp_tags , ff_nut_video_tags , 0 } ,
st - > codec - > codec_id = av_codec_get_id ( ( const AVCodecTag * const [ ] ) {
ff_codec_bmp_tags ,
ff_nut_video_tags ,
0
} ,
tmp ) ;
break ;
case 1 :
@ -338,7 +376,8 @@ static int decode_stream_header(NUTContext *nut){
return - 1 ;
}
if ( class < 3 & & st - > codec - > codec_id = = CODEC_ID_NONE )
av_log ( s , AV_LOG_ERROR , " Unknown codec tag '0x%04x' for stream number %d \n " ,
av_log ( s , AV_LOG_ERROR ,
" Unknown codec tag '0x%04x' for stream number %d \n " ,
( unsigned int ) tmp , stream_id ) ;
GET_V ( stc - > time_base_id , tmp < nut - > time_base_count ) ;
@ -350,7 +389,8 @@ static int decode_stream_header(NUTContext *nut){
GET_V ( st - > codec - > extradata_size , tmp < ( 1 < < 30 ) ) ;
if ( st - > codec - > extradata_size ) {
st - > codec - > extradata = av_mallocz ( st - > codec - > extradata_size + FF_INPUT_BUFFER_PADDING_SIZE ) ;
st - > codec - > extradata = av_mallocz ( st - > codec - > extradata_size +
FF_INPUT_BUFFER_PADDING_SIZE ) ;
avio_read ( bc , st - > codec - > extradata , st - > codec - > extradata_size ) ;
}
@ -360,7 +400,8 @@ static int decode_stream_header(NUTContext *nut){
st - > sample_aspect_ratio . num = ffio_read_varlen ( bc ) ;
st - > sample_aspect_ratio . den = ffio_read_varlen ( bc ) ;
if ( ( ! st - > sample_aspect_ratio . num ) ! = ( ! st - > sample_aspect_ratio . den ) ) {
av_log ( s , AV_LOG_ERROR , " invalid aspect ratio %d/%d \n " , st - > sample_aspect_ratio . num , st - > sample_aspect_ratio . den ) ;
av_log ( s , AV_LOG_ERROR , " invalid aspect ratio %d/%d \n " ,
st - > sample_aspect_ratio . num , st - > sample_aspect_ratio . den ) ;
return - 1 ;
}
ffio_read_varlen ( bc ) ; /* csp type */
@ -370,20 +411,24 @@ static int decode_stream_header(NUTContext *nut){
GET_V ( st - > codec - > channels , tmp > 0 )
}
if ( skip_reserved ( bc , end ) | | ffio_get_checksum ( bc ) ) {
av_log ( s , AV_LOG_ERROR , " stream header %d checksum mismatch \n " , stream_id ) ;
av_log ( s , AV_LOG_ERROR ,
" stream header %d checksum mismatch \n " , stream_id ) ;
return - 1 ;
}
stc - > time_base = & nut - > time_base [ stc - > time_base_id ] ;
avpriv_set_pts_info ( s - > streams [ stream_id ] , 63 , stc - > time_base - > num , stc - > time_base - > den ) ;
avpriv_set_pts_info ( s - > streams [ stream_id ] , 63 , stc - > time_base - > num ,
stc - > time_base - > den ) ;
return 0 ;
}
static void set_disposition_bits ( AVFormatContext * avf , char * value , int stream_id ) {
static void set_disposition_bits ( AVFormatContext * avf , char * value ,
int stream_id )
{
int flag = 0 , i ;
for ( i = 0 ; ff_nut_dispositions [ i ] . flag ; + + i ) {
for ( i = 0 ; ff_nut_dispositions [ i ] . flag ; + + i )
if ( ! strcmp ( ff_nut_dispositions [ i ] . str , value ) )
flag = ff_nut_dispositions [ i ] . flag ;
}
if ( ! flag )
av_log ( avf , AV_LOG_INFO , " unknown disposition type '%s' \n " , value ) ;
for ( i = 0 ; i < avf - > nb_streams ; + + i )
@ -391,7 +436,8 @@ static void set_disposition_bits(AVFormatContext* avf, char* value, int stream_i
avf - > streams [ i ] - > disposition | = flag ;
}
static int decode_info_header ( NUTContext * nut ) {
static int decode_info_header ( NUTContext * nut )
{
AVFormatContext * s = nut - > avf ;
AVIOContext * bc = s - > pb ;
uint64_t tmp , chapter_start , chapter_len ;
@ -416,7 +462,8 @@ static int decode_info_header(NUTContext *nut){
if ( chapter_id & & ! stream_id_plus1 ) {
int64_t start = chapter_start / nut - > time_base_count ;
chapter = avpriv_new_chapter ( s , chapter_id ,
nut - > time_base [ chapter_start % nut - > time_base_count ] ,
nut - > time_base [ chapter_start %
nut - > time_base_count ] ,
start , start + chapter_len , NULL ) ;
metadata = & chapter - > metadata ;
} else if ( stream_id_plus1 ) {
@ -458,8 +505,8 @@ static int decode_info_header(NUTContext *nut){
set_disposition_bits ( s , str_value , stream_id_plus1 - 1 ) ;
continue ;
}
if ( metadata & & av_strcasecmp ( name , " Uses " )
& & av_strcasecmp ( name , " Depends " ) & & av_strcasecmp ( name , " Replaces " ) )
if ( metadata & & av_strcasecmp ( name , " Uses " ) & &
av_strcasecmp ( name , " Depends " ) & & av_strcasecmp ( name , " Replaces " ) )
av_dict_set ( metadata , name , str_value , 0 ) ;
}
}
@ -471,7 +518,8 @@ static int decode_info_header(NUTContext *nut){
return 0 ;
}
static int decode_syncpoint ( NUTContext * nut , int64_t * ts , int64_t * back_ptr ) {
static int decode_syncpoint ( NUTContext * nut , int64_t * ts , int64_t * back_ptr )
{
AVFormatContext * s = nut - > avf ;
AVIOContext * bc = s - > pb ;
int64_t end , tmp ;
@ -486,20 +534,23 @@ static int decode_syncpoint(NUTContext *nut, int64_t *ts, int64_t *back_ptr){
if ( * back_ptr < 0 )
return - 1 ;
ff_nut_reset_ts ( nut , nut - > time_base [ tmp % nut - > time_base_count ] , tmp / nut - > time_base_count ) ;
ff_nut_reset_ts ( nut , nut - > time_base [ tmp % nut - > time_base_count ] ,
tmp / nut - > time_base_count ) ;
if ( skip_reserved ( bc , end ) | | ffio_get_checksum ( bc ) ) {
av_log ( s , AV_LOG_ERROR , " sync point checksum mismatch \n " ) ;
return - 1 ;
}
* ts = tmp / s - > nb_streams * av_q2d ( nut - > time_base [ tmp % s - > nb_streams ] ) * AV_TIME_BASE ;
* ts = tmp / s - > nb_streams *
av_q2d ( nut - > time_base [ tmp % s - > nb_streams ] ) * AV_TIME_BASE ;
ff_nut_add_sp ( nut , nut - > last_syncpoint_pos , * back_ptr , * ts ) ;
return 0 ;
}
static int find_and_decode_index ( NUTContext * nut ) {
static int find_and_decode_index ( NUTContext * nut )
{
AVFormatContext * s = nut - > avf ;
AVIOContext * bc = s - > pb ;
uint64_t tmp , end ;
@ -572,13 +623,8 @@ static int find_and_decode_index(NUTContext *nut){
// eor_pts[j][i] = last_pts + A + B
} else
B = 0 ;
av_add_index_entry (
s - > streams [ i ] ,
16 * syncpoints [ j - 1 ] ,
last_pts + A ,
0 ,
0 ,
AVINDEX_KEYFRAME ) ;
av_add_index_entry ( s - > streams [ i ] , 16 * syncpoints [ j - 1 ] ,
last_pts + A , 0 , 0 , AVINDEX_KEYFRAME ) ;
last_pts + = A + B ;
}
}
@ -590,6 +636,7 @@ static int find_and_decode_index(NUTContext *nut){
goto fail ;
}
ret = 0 ;
fail :
av_free ( syncpoints ) ;
av_free ( has_keyframe ) ;
@ -660,7 +707,9 @@ static int nut_read_header(AVFormatContext *s)
return 0 ;
}
static int decode_frame_header ( NUTContext * nut , int64_t * pts , int * stream_id , uint8_t * header_idx , int frame_code ) {
static int decode_frame_header ( NUTContext * nut , int64_t * pts , int * stream_id ,
uint8_t * header_idx , int frame_code )
{
AVFormatContext * s = nut - > avf ;
AVIOContext * bc = s - > pb ;
StreamContext * stc ;
@ -668,7 +717,9 @@ static int decode_frame_header(NUTContext *nut, int64_t *pts, int *stream_id, ui
uint64_t tmp ;
if ( avio_tell ( bc ) > nut - > last_syncpoint_pos + nut - > max_distance ) {
av_log ( s , AV_LOG_ERROR , " Last frame must have been damaged % " PRId64 " > % " PRId64 " + %d \n " , avio_tell ( bc ) , nut - > last_syncpoint_pos , nut - > max_distance ) ;
av_log ( s , AV_LOG_ERROR ,
" Last frame must have been damaged % " PRId64 " > % " PRId64 " + %d \n " ,
avio_tell ( bc ) , nut - > last_syncpoint_pos , nut - > max_distance ) ;
return AVERROR_INVALIDDATA ;
}
@ -697,9 +748,8 @@ static int decode_frame_header(NUTContext *nut, int64_t *pts, int *stream_id, ui
* pts = coded_pts - ( 1 < < stc - > msb_pts_shift ) ;
} else
* pts = stc - > last_pts + pts_delta ;
if ( flags & FLAG_SIZE_MSB ) {
if ( flags & FLAG_SIZE_MSB )
size + = size_mul * ffio_read_varlen ( bc ) ;
}
if ( flags & FLAG_MATCH_TIME )
get_s ( bc ) ;
if ( flags & FLAG_HEADER_IDX )
@ -719,7 +769,8 @@ static int decode_frame_header(NUTContext *nut, int64_t *pts, int *stream_id, ui
if ( flags & FLAG_CHECKSUM ) {
avio_rb32 ( bc ) ; // FIXME check this
} else if ( size > 2 * nut - > max_distance | | FFABS ( stc - > last_pts - * pts ) > stc - > max_pts_distance ) {
} else if ( size > 2 * nut - > max_distance | | FFABS ( stc - > last_pts - * pts ) >
stc - > max_pts_distance ) {
av_log ( s , AV_LOG_ERROR , " frame size > 2max_distance and no checksum \n " ) ;
return AVERROR_INVALIDDATA ;
}
@ -730,7 +781,8 @@ static int decode_frame_header(NUTContext *nut, int64_t *pts, int *stream_id, ui
return size ;
}
static int decode_frame ( NUTContext * nut , AVPacket * pkt , int frame_code ) {
static int decode_frame ( NUTContext * nut , AVPacket * pkt , int frame_code )
{
AVFormatContext * s = nut - > avf ;
AVIOContext * bc = s - > pb ;
int size , stream_id , discard ;
@ -749,10 +801,11 @@ static int decode_frame(NUTContext *nut, AVPacket *pkt, int frame_code){
discard = s - > streams [ stream_id ] - > discard ;
last_IP_pts = s - > streams [ stream_id ] - > last_IP_pts ;
if ( ( discard > = AVDISCARD_NONKEY & & ! ( stc - > last_flags & FLAG_KEY ) )
| | ( discard > = AVDISCARD_BIDIR & & last_IP_pts ! = AV_NOPTS_VALUE & & last_IP_pts > pts )
| | discard > = AVDISCARD_ALL
| | stc - > skip_until_key_frame ) {
if ( ( discard > = AVDISCARD_NONKEY & & ! ( stc - > last_flags & FLAG_KEY ) ) | |
( discard > = AVDISCARD_BIDIR & & last_IP_pts ! = AV_NOPTS_VALUE & &
last_IP_pts > pts ) | |
discard > = AVDISCARD_ALL | |
stc - > skip_until_key_frame ) {
avio_skip ( bc , size ) ;
return 1 ;
}
@ -813,7 +866,7 @@ static int nut_read_packet(AVFormatContext *s, AVPacket *pkt)
ret = decode_frame ( nut , pkt , frame_code ) ;
if ( ret = = 0 )
return 0 ;
else if ( ret = = 1 ) //ok but discard packet
else if ( ret = = 1 ) // OK but discard packet
break ;
default :
resync :
@ -827,11 +880,14 @@ av_log(s, AV_LOG_DEBUG, "sync\n");
}
}
static int64_t nut_read_timestamp ( AVFormatContext * s , int stream_index , int64_t * pos_arg , int64_t pos_limit ) {
static int64_t nut_read_timestamp ( AVFormatContext * s , int stream_index ,
int64_t * pos_arg , int64_t pos_limit )
{
NUTContext * nut = s - > priv_data ;
AVIOContext * bc = s - > pb ;
int64_t pos , pts , back_ptr ;
av_log ( s , AV_LOG_DEBUG , " read_timestamp(X,%d,% " PRId64 " ,% " PRId64 " ) \n " , stream_index , * pos_arg , pos_limit ) ;
av_log ( s , AV_LOG_DEBUG , " read_timestamp(X,%d,% " PRId64 " ,% " PRId64 " ) \n " ,
stream_index , * pos_arg , pos_limit ) ;
pos = * pos_arg ;
do {
@ -846,13 +902,17 @@ av_log(s, AV_LOG_DEBUG, "read_timestamp(X,%d,%"PRId64",%"PRId64")\n", stream_ind
assert ( nut - > last_syncpoint_pos = = * pos_arg ) ;
av_log ( s , AV_LOG_DEBUG , " return % " PRId64 " % " PRId64 " \n " , pts , back_ptr ) ;
if ( stream_index = = - 1 ) return pts ;
else if ( stream_index = = - 2 ) return back_ptr ;
if ( stream_index = = - 1 )
return pts ;
else if ( stream_index = = - 2 )
return back_ptr ;
assert ( 0 ) ;
}
static int read_seek ( AVFormatContext * s , int stream_index , int64_t pts , int flags ) {
static int read_seek ( AVFormatContext * s , int stream_index ,
int64_t pts , int flags )
{
NUTContext * nut = s - > priv_data ;
AVStream * st = s - > streams [ stream_index ] ;
Syncpoint dummy = { . ts = pts * av_q2d ( st - > time_base ) * AV_TIME_BASE } ;
@ -871,18 +931,23 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flag
} else {
av_tree_find ( nut - > syncpoints , & dummy , ( void * ) ff_nut_sp_pts_cmp ,
( void * * ) next_node ) ;
av_log ( s , AV_LOG_DEBUG , " % " PRIu64 " -% " PRIu64 " % " PRId64 " -% " PRId64 " \n " , next_node [ 0 ] - > pos , next_node [ 1 ] - > pos ,
next_node [ 0 ] - > ts , next_node [ 1 ] - > ts ) ;
pos = ff_gen_search ( s , - 1 , dummy . ts , next_node [ 0 ] - > pos , next_node [ 1 ] - > pos , next_node [ 1 ] - > pos ,
next_node [ 0 ] - > ts , next_node [ 1 ] - > ts , AVSEEK_FLAG_BACKWARD , & ts , nut_read_timestamp ) ;
av_log ( s , AV_LOG_DEBUG , " % " PRIu64 " -% " PRIu64 " % " PRId64 " -% " PRId64 " \n " ,
next_node [ 0 ] - > pos , next_node [ 1 ] - > pos , next_node [ 0 ] - > ts ,
next_node [ 1 ] - > ts ) ;
pos = ff_gen_search ( s , - 1 , dummy . ts , next_node [ 0 ] - > pos ,
next_node [ 1 ] - > pos , next_node [ 1 ] - > pos ,
next_node [ 0 ] - > ts , next_node [ 1 ] - > ts ,
AVSEEK_FLAG_BACKWARD , & ts , nut_read_timestamp ) ;
if ( ! ( flags & AVSEEK_FLAG_BACKWARD ) ) {
dummy . pos = pos + 16 ;
next_node [ 1 ] = & nopts_sp ;
av_tree_find ( nut - > syncpoints , & dummy , ( void * ) ff_nut_sp_pos_cmp ,
( void * * ) next_node ) ;
pos2 = ff_gen_search ( s , - 2 , dummy . pos , next_node [ 0 ] - > pos , next_node [ 1 ] - > pos , next_node [ 1 ] - > pos ,
next_node [ 0 ] - > back_ptr , next_node [ 1 ] - > back_ptr , flags , & ts , nut_read_timestamp ) ;
pos2 = ff_gen_search ( s , - 2 , dummy . pos , next_node [ 0 ] - > pos ,
next_node [ 1 ] - > pos , next_node [ 1 ] - > pos ,
next_node [ 0 ] - > back_ptr , next_node [ 1 ] - > back_ptr ,
flags , & ts , nut_read_timestamp ) ;
if ( pos2 > = 0 )
pos = pos2 ;
// FIXME dir but I think it does not matter
@ -898,9 +963,8 @@ static int read_seek(AVFormatContext *s, int stream_index, int64_t pts, int flag
pos = find_startcode ( s - > pb , SYNCPOINT_STARTCODE , pos2 ) ;
avio_seek ( s - > pb , pos , SEEK_SET ) ;
av_log ( NULL , AV_LOG_DEBUG , " SP: % " PRId64 " \n " , pos ) ;
if ( pos2 > pos | | pos2 + 15 < pos ) {
if ( pos2 > pos | | pos2 + 15 < pos )
av_log ( NULL , AV_LOG_ERROR , " no syncpoint at backptr pos \n " ) ;
}
for ( i = 0 ; i < s - > nb_streams ; i + + )
nut - > stream [ i ] . skip_until_key_frame = 1 ;