vlc | branch: master | Francois Cartegnie <[email protected]> | Wed Apr 20 15:02:30 2016 +0200| [8583802633ad0f0873acd3926fe7ae2b43f5d486] | committer: Francois Cartegnie
access: dvb: scan: use fixed packet buffer > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8583802633ad0f0873acd3926fe7ae2b43f5d486 --- modules/access/dvb/access.c | 12 ++++-------- modules/access/dvb/dvb.h | 2 ++ modules/access/dvb/scan.c | 34 +++++++++++----------------------- modules/access/dvb/scan.h | 2 +- 4 files changed, 18 insertions(+), 32 deletions(-) diff --git a/modules/access/dvb/access.c b/modules/access/dvb/access.c index 97f1ed5..5d61616 100644 --- a/modules/access/dvb/access.c +++ b/modules/access/dvb/access.c @@ -99,7 +99,6 @@ static block_t *BlockScan( access_t * ); #define DVB_READ_ONCE 20 #define DVB_READ_ONCE_START 2 #define DVB_READ_ONCE_SCAN 1 -#define TS_PACKET_SIZE 188 #define DVB_SCAN_MAX_SIGNAL_TIME (1000*1000) #define DVB_SCAN_MAX_LOCK_TIME (5000*1000) @@ -355,19 +354,16 @@ static block_t *BlockScan( access_t *p_access ) if( i_probe_start == 0 ) i_probe_start = mdate(); - block_t *p_block = block_Alloc( DVB_READ_ONCE_SCAN * TS_PACKET_SIZE ); - - if( ( i_ret = read( p_sys->i_handle, p_block->p_buffer, - DVB_READ_ONCE_SCAN * TS_PACKET_SIZE ) ) <= 0 ) + ssize_t i_read = read( p_sys->i_handle, &p_sys->packet, TS_PACKET_SIZE ); + if( i_read <= 0 ) { msg_Warn( p_access, "read failed: %s", vlc_strerror_c(errno) ); - block_Release( p_block ); continue; } - p_block->i_buffer = i_ret; /* */ - if( scan_session_Push( session, p_block ) ) + if( i_read == TS_PACKET_SIZE && + scan_session_Push( session, &p_sys->packet ) ) { msg_Dbg( p_access, "finished scanning current frequency" ); break; diff --git a/modules/access/dvb/dvb.h b/modules/access/dvb/dvb.h index 9c5eadf..fee35bf 100644 --- a/modules/access/dvb/dvb.h +++ b/modules/access/dvb/dvb.h @@ -49,6 +49,7 @@ typedef struct } frontend_status_t; #define MAX_DEMUX 256 +#define TS_PACKET_SIZE 188 struct scan_t; struct scan_parameter_t; @@ -70,6 +71,7 @@ struct access_sys_t /* Scan */ struct scan_t *scan; + uint8_t packet[TS_PACKET_SIZE]; }; #define VIDEO0_TYPE 1 diff --git a/modules/access/dvb/scan.c b/modules/access/dvb/scan.c index bc55f46..a2ec09e 100644 --- a/modules/access/dvb/scan.c +++ b/modules/access/dvb/scan.c @@ -1523,37 +1523,33 @@ block_t *scan_GetM3U( scan_t *p_scan ) return p_playlist ? block_ChainGather( p_playlist ) : NULL; } -bool scan_session_Push( scan_session_t *p_scan, block_t *p_block ) +#define dvbpsi_packet_push(a,b) dvbpsi_packet_push(a, (uint8_t *)b) + +bool scan_session_Push( scan_session_t *p_scan, const uint8_t *p_packet ) { - if( p_block->i_buffer < 188 || p_block->p_buffer[0] != 0x47 ) - { - block_Release( p_block ); + if( p_packet[0] != 0x47 ) return false; - } /* */ - const int i_pid = ( (p_block->p_buffer[1]&0x1f)<<8) | p_block->p_buffer[2]; + const int i_pid = ( (p_packet[1]&0x1f)<<8) | p_packet[2]; if( i_pid == 0x00 ) { if( !p_scan->p_pathandle ) { p_scan->p_pathandle = dvbpsi_new( &dvbpsi_messages, DVBPSI_MSG_DEBUG ); if( !p_scan->p_pathandle ) - { - block_Release( p_block ); return false; - } + p_scan->p_pathandle->p_sys = (void *) VLC_OBJECT(p_scan->p_obj); if( !dvbpsi_pat_attach( p_scan->p_pathandle, (dvbpsi_pat_callback)PATCallBack, p_scan ) ) { dvbpsi_delete( p_scan->p_pathandle ); p_scan->p_pathandle = NULL; - block_Release( p_block ); return false; } } if( p_scan->p_pathandle ) - dvbpsi_packet_push( p_scan->p_pathandle, p_block->p_buffer ); + dvbpsi_packet_push( p_scan->p_pathandle, p_packet ); } else if( i_pid == 0x11 ) { @@ -1561,22 +1557,19 @@ bool scan_session_Push( scan_session_t *p_scan, block_t *p_block ) { p_scan->p_sdthandle = dvbpsi_new( &dvbpsi_messages, DVBPSI_MSG_DEBUG ); if( !p_scan->p_sdthandle ) - { - block_Release( p_block ); return false; - } + p_scan->p_sdthandle->p_sys = (void *) VLC_OBJECT(p_scan->p_obj); if( !dvbpsi_AttachDemux( p_scan->p_sdthandle, (dvbpsi_demux_new_cb_t)PSINewTableCallBack, p_scan ) ) { dvbpsi_delete( p_scan->p_sdthandle ); p_scan->p_sdthandle = NULL; - block_Release( p_block ); return false; } } if( p_scan->p_sdthandle ) - dvbpsi_packet_push( p_scan->p_sdthandle, p_block->p_buffer ); + dvbpsi_packet_push( p_scan->p_sdthandle, p_packet ); } else if( p_scan->b_use_nit ) /*if( i_pid == p_scan->i_nit_pid )*/ { @@ -1584,25 +1577,20 @@ bool scan_session_Push( scan_session_t *p_scan, block_t *p_block ) { p_scan->p_nithandle = dvbpsi_new( &dvbpsi_messages, DVBPSI_MSG_DEBUG ); if( !p_scan->p_nithandle ) - { - block_Release( p_block ); return false; - } + p_scan->p_nithandle->p_sys = (void *) VLC_OBJECT(p_scan->p_obj); if( !dvbpsi_AttachDemux( p_scan->p_nithandle, (dvbpsi_demux_new_cb_t)PSINewTableCallBack, p_scan ) ) { dvbpsi_delete( p_scan->p_nithandle ); p_scan->p_nithandle = NULL; - block_Release( p_block ); return false; } } if( p_scan->p_nithandle ) - dvbpsi_packet_push( p_scan->p_nithandle, p_block->p_buffer ); + dvbpsi_packet_push( p_scan->p_nithandle, p_packet ); } - block_Release( p_block ); - return p_scan->local.p_pat && p_scan->local.p_sdt && (!p_scan->b_use_nit || p_scan->local.p_nit); } diff --git a/modules/access/dvb/scan.h b/modules/access/dvb/scan.h index 6b4a306..dc5ce7a 100644 --- a/modules/access/dvb/scan.h +++ b/modules/access/dvb/scan.h @@ -90,6 +90,6 @@ typedef struct scan_session_t scan_session_t; scan_session_t *scan_session_New( scan_t *, const scan_tuner_config_t * ); void scan_session_Destroy( scan_t *, scan_session_t * ); -bool scan_session_Push( scan_session_t *p_scan, block_t *p_block ); +bool scan_session_Push( scan_session_t *p_scan, const uint8_t * ); void scan_session_SetSNR( scan_session_t *p_scan, int i_snr ); unsigned scan_session_GetTablesTimeout( const scan_session_t * ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
