📄 nsv.c
字号:
if( p_sys->fmt_audio.i_codec == VLC_FOURCC( 'a', 'r', 'a', 'w' ) ) { uint8_t h[4]; stream_Read( p_demux->s, h, 4 ); p_sys->fmt_audio.audio.i_channels = h[1]; p_sys->fmt_audio.audio.i_rate = GetWLE( &h[2] ); i_size -= 4; } if( p_sys->p_audio == NULL ) { p_sys->p_audio = es_out_Add( p_demux->out, &p_sys->fmt_audio ); } if( ( p_frame = stream_Block( p_demux->s, i_size ) ) ) { p_frame->i_dts = p_frame->i_pts = p_sys->i_pcr; es_out_Send( p_demux->out, p_sys->p_audio, p_frame ); } } p_sys->i_pcr += p_sys->i_pcr_inc; if( p_sys->i_time >= 0 ) { p_sys->i_time += p_sys->i_pcr_inc; } return 1;}/***************************************************************************** * Control: *****************************************************************************/static int Control( demux_t *p_demux, int i_query, va_list args ){ demux_sys_t *p_sys = p_demux->p_sys; double f, *pf; int64_t i64, *pi64; switch( i_query ) { case DEMUX_GET_POSITION: pf = (double*) va_arg( args, double* ); i64 = stream_Size( p_demux->s ); if( i64 > 0 ) { *pf = (double)stream_Tell( p_demux->s ) / (double)i64; } else { *pf = 0.0; } return VLC_SUCCESS; case DEMUX_SET_POSITION: f = (double) va_arg( args, double ); i64 = stream_Size( p_demux->s ); es_out_Control( p_demux->out, ES_OUT_RESET_PCR ); if( stream_Seek( p_demux->s, (int64_t)(i64 * f) ) || ReSynch( p_demux ) ) { return VLC_EGENERIC; } p_sys->i_time = -1; /* Invalidate time display */ return VLC_SUCCESS; case DEMUX_GET_TIME: pi64 = (int64_t*)va_arg( args, int64_t * ); if( p_sys->i_time < 0 ) { *pi64 = 0; return VLC_EGENERIC; } *pi64 = p_sys->i_time; return VLC_SUCCESS;#if 0 case DEMUX_GET_LENGTH: pi64 = (int64_t*)va_arg( args, int64_t * ); if( p_sys->i_mux_rate > 0 ) { *pi64 = (int64_t)1000000 * ( stream_Size( p_demux->s ) / 50 ) / p_sys->i_mux_rate; return VLC_SUCCESS; } *pi64 = 0; return VLC_EGENERIC;#endif case DEMUX_GET_FPS: pf = (double*)va_arg( args, double * ); *pf = (double)1000000.0 / (double)p_sys->i_pcr_inc; return VLC_SUCCESS; case DEMUX_SET_TIME: default: return VLC_EGENERIC; }}/***************************************************************************** * ReSynch: *****************************************************************************/static int ReSynch( demux_t *p_demux ){ uint8_t *p_peek; int i_skip; int i_peek; while( !p_demux->b_die ) { if( ( i_peek = stream_Peek( p_demux->s, &p_peek, 1024 ) ) < 8 ) { return VLC_EGENERIC; } i_skip = 0; while( i_skip < i_peek - 4 ) { if( !strncmp( p_peek, "NSVf", 4 ) || !strncmp( p_peek, "NSVs", 4 ) ) { if( i_skip > 0 ) { stream_Read( p_demux->s, NULL, i_skip ); } return VLC_SUCCESS; } p_peek++; i_skip++; } stream_Read( p_demux->s, NULL, i_skip ); } return VLC_EGENERIC;}/***************************************************************************** * ReadNSVf: *****************************************************************************/static int ReadNSVf( demux_t *p_demux ){ /* demux_sys_t *p_sys = p_demux->p_sys; */ uint8_t *p; int i_size; msg_Dbg( p_demux, "new NSVf chunk" ); if( stream_Peek( p_demux->s, &p, 8 ) < 8 ) { return VLC_EGENERIC; } i_size = GetDWLE( &p[4] ); msg_Dbg( p_demux, " - size=%d", i_size ); return stream_Read( p_demux->s, NULL, i_size ) == i_size ? VLC_SUCCESS : VLC_EGENERIC;}/***************************************************************************** * ReadNSVf: *****************************************************************************/static int ReadNSVs( demux_t *p_demux ){ demux_sys_t *p_sys = p_demux->p_sys; uint8_t header[19]; vlc_fourcc_t fcc; if( stream_Read( p_demux->s, header, 19 ) < 19 ) { msg_Warn( p_demux, "cannot read" ); return VLC_EGENERIC; } msg_Dbg( p_demux, "new NSVs chunk" ); /* Video */ switch( ( fcc = VLC_FOURCC( header[4], header[5], header[6], header[7] ) ) ) { case VLC_FOURCC( 'V', 'P', '3', ' ' ): case VLC_FOURCC( 'V', 'P', '3', '1' ): fcc = VLC_FOURCC( 'V', 'P', '3', '1' ); break; case VLC_FOURCC( 'N', 'O', 'N', 'E' ): break; default: msg_Warn( p_demux, "unknown codec" ); break; } if( fcc != VLC_FOURCC( 'N', 'O', 'N', 'E' ) && fcc != p_sys->fmt_video.i_codec ) { es_format_Init( &p_sys->fmt_video, VIDEO_ES, fcc ); p_sys->fmt_video.video.i_width = GetWLE( &header[12] ); p_sys->fmt_video.video.i_height = GetWLE( &header[14] ); if( p_sys->p_video ) { es_out_Del( p_demux->out, p_sys->p_video ); } p_sys->p_video = es_out_Add( p_demux->out, &p_sys->fmt_video ); msg_Dbg( p_demux, " - video `%4.4s' %dx%d", (char*)&fcc, p_sys->fmt_video.video.i_width, p_sys->fmt_video.video.i_height ); } /* Audio */ switch( ( fcc = VLC_FOURCC( header[8], header[9], header[10], header[11] ) ) ) { case VLC_FOURCC( 'M', 'P', '3', ' ' ): fcc = VLC_FOURCC( 'm', 'p', 'g', 'a' ); break; case VLC_FOURCC( 'P', 'C', 'M', ' ' ): fcc = VLC_FOURCC( 'a', 'r', 'a', 'w' ); break; case VLC_FOURCC( 'A', 'A', 'C', ' ' ): case VLC_FOURCC( 'A', 'A', 'C', 'P' ): fcc = VLC_FOURCC( 'm', 'p', '4', 'a' ); break; case VLC_FOURCC( 'N', 'O', 'N', 'E' ): break; default: msg_Warn( p_demux, "unknown codec" ); break; } if( fcc != VLC_FOURCC( 'N', 'O', 'N', 'E' ) && fcc != p_sys->fmt_audio.i_codec ) { msg_Dbg( p_demux, " - audio `%4.4s'", (char*)&fcc ); if( p_sys->p_audio ) { es_out_Del( p_demux->out, p_sys->p_audio ); p_sys->p_audio = NULL; } es_format_Init( &p_sys->fmt_audio, AUDIO_ES, fcc ); } if( header[16]&0x80 ) { /* Fractional frame rate */ switch( header[16]&0x03 ) { case 0: /* 30 fps */ p_sys->i_pcr_inc = 33333; /* 300000/9 */ break; case 1: /* 29.97 fps */ p_sys->i_pcr_inc = 33367; /* 300300/9 */ break; case 2: /* 25 fps */ p_sys->i_pcr_inc = 40000; /* 360000/9 */ break; case 3: /* 23.98 fps */ p_sys->i_pcr_inc = 41700; /* 375300/9 */ break; } if( header[16] < 0xc0 ) p_sys->i_pcr_inc = p_sys->i_pcr_inc * (((header[16] ^ 0x80) >> 2 ) +1 ); else p_sys->i_pcr_inc = p_sys->i_pcr_inc / (((header[16] ^ 0xc0) >> 2 ) +1 ); } else if( header[16] != 0 ) { /* Integer frame rate */ p_sys->i_pcr_inc = 1000000 / header[16]; } else { msg_Dbg( p_demux, "invalid fps (0x00)" ); p_sys->i_pcr_inc = 40000; } msg_Dbg( p_demux, " - fps=%.3f", 1000000.0 / (double)p_sys->i_pcr_inc ); return VLC_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -