Commit 85838026 authored by François Cartegnie's avatar François Cartegnie 🤞

access: dvb: scan: use fixed packet buffer

parent 89e2ba15
......@@ -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;
......
......@@ -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
......
......@@ -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);
}
......
......@@ -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 * );
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment