@ -177,6 +177,7 @@ typedef struct {
int64_t duration ;
uint32_t vtag , atag ;
uint16_t vwidth , vheight ;
int16_t avsync ;
//DVDemuxContext* dv_demux;
} NSVContext ;
@ -405,7 +406,6 @@ static int nsv_parse_NSVs_header(AVFormatContext *s, AVFormatParameters *ap)
uint16_t vwidth , vheight ;
AVRational framerate ;
int i ;
uint16_t unknown ;
AVStream * st ;
NSVStream * nst ;
PRINT ( ( " %s() \n " , __FUNCTION__ ) ) ;
@ -420,7 +420,7 @@ static int nsv_parse_NSVs_header(AVFormatContext *s, AVFormatParameters *ap)
PRINT ( ( " NSV NSVs framerate code %2x \n " , i ) ) ;
if ( i & 0x80 ) framerate = nsv_framerate_table [ i & 0x7F ] ;
else framerate = ( AVRational ) { i , 1 } ;
unknown = get_le16 ( pb ) ;
nsv - > avsync = get_le16 ( pb ) ;
# ifdef DEBUG
print_tag ( " NSV NSVs vtag " , vtag , 0 ) ;
print_tag ( " NSV NSVs atag " , atag , 0 ) ;
@ -466,15 +466,13 @@ static int nsv_parse_NSVs_header(AVFormatContext *s, AVFormatParameters *ap)
st - > codec - > codec_type = CODEC_TYPE_AUDIO ;
st - > codec - > codec_tag = atag ;
st - > codec - > codec_id = codec_get_id ( nsv_codec_audio_tags , atag ) ;
st - > start_time = 0 ;
// st->duration = nsv->duration; //FIXME
st - > need_parsing = 1 ; /* for PCM we will read a chunk later and put correct info */
/* XXX:FIXME */
//st->codec->channels = 2; //XXX:channels;
//st->codec->sample_rate = 1000;
//av_set_pts_info(st, 64, 1, st->codec->sample_rate);
/* set timebase to common denominator of ms and framerate */
av_set_pts_info ( st , 64 , 1 , framerate . num * 1000 ) ;
st - > start_time = 0 ;
st - > duration = ( int64_t ) nsv - > duration * framerate . num ;
# endif
}
# ifdef CHECK_SUBSEQUENT_NSVS
@ -598,7 +596,7 @@ null_chunk_retry:
av_get_packet ( pb , pkt , vsize ) ;
pkt - > stream_index = st [ NSV_ST_VIDEO ] - > index ; //NSV_ST_VIDEO;
pkt - > dts = nst - > frame_offset + + ;
pkt - > flags | = PKT_FLAG_KEY ; /* stupid format has no way to tell XXX: try the index */
pkt - > flags | = nsv - > state = = NSV_HAS_READ_NSVS ? PKT_FLAG_KEY : 0 ; /* keyframe only likely on a sync frame */
/*
for ( i = 0 ; i < MIN ( 8 , vsize ) ; i + + )
PRINT ( ( " NSV video: [%d] = %02x \n " , i , pkt - > data [ i ] ) ) ;
@ -630,20 +628,22 @@ null_chunk_retry:
channels = 1 ;
st [ NSV_ST_AUDIO ] - > codec - > channels = channels ;
st [ NSV_ST_AUDIO ] - > codec - > sample_rate = samplerate ;
av_set_pts_info ( st [ NSV_ST_AUDIO ] , 64 , 1 ,
st [ NSV_ST_AUDIO ] - > codec - > sample_rate ) ;
PRINT ( ( " NSV RAWAUDIO: bps %d, nchan %d, srate %d \n " , bps , channels , samplerate ) ) ;
}
}
av_get_packet ( pb , pkt , asize ) ;
pkt - > stream_index = st [ NSV_ST_AUDIO ] - > index ; //NSV_ST_AUDIO;
//pkt->dts = nst->frame_offset;
//if (nst->sample_size)
// pkt->dts /= nst->sample_size;
nst - > frame_offset + = asize ; // XXX: that's valid only for PCM !?
pkt - > flags | = nsv - > state = = NSV_HAS_READ_NSVS ? PKT_FLAG_KEY : 0 ; /* keyframe only likely on a sync frame */
if ( nsv - > state = = NSV_HAS_READ_NSVS & & st [ NSV_ST_VIDEO ] ) {
/* on a nsvs frame we have new information on a/v sync */
pkt - > dts = ( ( ( NSVStream * ) st [ NSV_ST_VIDEO ] - > priv_data ) - > frame_offset - 1 ) ;
pkt - > dts * = ( int64_t ) 1000 * st [ NSV_ST_VIDEO ] - > time_base . num ;
pkt - > dts + = ( int64_t ) nsv - > avsync * st [ NSV_ST_VIDEO ] - > time_base . den ;
PRINT ( ( " NSV AUDIO: sync:%d, dts:% " PRId64 , nsv - > avsync , pkt - > dts ) ) ;
}
nst - > frame_offset + + ;
}
//pkt->flags |= PKT_FLAG_KEY;
nsv - > state = NSV_UNSYNC ;
return 0 ;
}