[vlc-commits] dshow: Store streams in a vector
Hugo Beauzée-Luyssen
git at videolan.org
Tue Dec 6 17:47:51 CET 2016
vlc | branch: master | Hugo Beauzée-Luyssen <hugo at beauzee.fr> | Tue Dec 6 16:20:21 2016 +0100| [e6056f355336d24f5367b34266d9b636d8e97fc3] | committer: Hugo Beauzée-Luyssen
dshow: Store streams in a vector
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=e6056f355336d24f5367b34266d9b636d8e97fc3
---
modules/access/dshow/access.h | 5 +++--
modules/access/dshow/dshow.cpp | 50 +++++++++++++++++++++++-------------------
2 files changed, 30 insertions(+), 25 deletions(-)
diff --git a/modules/access/dshow/access.h b/modules/access/dshow/access.h
index 18665f6..da6ee85 100644
--- a/modules/access/dshow/access.h
+++ b/modules/access/dshow/access.h
@@ -28,6 +28,8 @@
#include <dshow.h>
+#include <vector>
+
#include <wrl/client.h>
using Microsoft::WRL::ComPtr;
@@ -69,8 +71,7 @@ struct access_sys_t
CrossbarRoute crossbar_routes[MAX_CROSSBAR_DEPTH];
/* list of elementary streams */
- dshow_stream_t **pp_streams;
- int i_streams;
+ std::vector<dshow_stream_t*> pp_streams;
int i_current_stream;
/* misc properties */
diff --git a/modules/access/dshow/dshow.cpp b/modules/access/dshow/dshow.cpp
index 57407a9..ebaf12e 100644
--- a/modules/access/dshow/dshow.cpp
+++ b/modules/access/dshow/dshow.cpp
@@ -356,17 +356,19 @@ static void DeleteDirectShowGraph( vlc_object_t *p_this, access_sys_t *p_sys )
/* Remove filters from graph */
msg_Dbg( p_this, "DeleteDirectShowGraph: Removing filters" );
- for( int i = 0; i < p_sys->i_streams; i++ )
+ std::vector<dshow_stream_t*>::iterator it = p_sys->pp_streams.begin();
+ std::vector<dshow_stream_t*>::iterator end = p_sys->pp_streams.end();
+ for( ; it != end; ++it )
{
/* RemoveFilter does an undocumented Release()
* but does not set item to NULL */
msg_Dbg( p_this, "DeleteDirectShowGraph: Removing capture filter" );
- p_sys->p_graph->RemoveFilter( p_sys->pp_streams[i]->p_capture_filter.Get() );
- p_sys->pp_streams[i]->p_capture_filter.Reset();
+ p_sys->p_graph->RemoveFilter( (*it)->p_capture_filter.Get() );
+ (*it)->p_capture_filter.Reset();
msg_Dbg( p_this, "DeleteDirectShowGraph: Removing device filter" );
- p_sys->p_graph->RemoveFilter( p_sys->pp_streams[i]->p_device_filter.Get() );
- p_sys->pp_streams[i]->p_device_filter.Reset();
+ p_sys->p_graph->RemoveFilter( (*it)->p_device_filter.Get() );
+ (*it)->p_device_filter.Reset();
}
/* Release directshow objects */
@@ -489,8 +491,6 @@ static int CommonOpen( vlc_object_t *p_this, access_sys_t *p_sys,
/* Initialize some data */
- p_sys->i_streams = 0;
- p_sys->pp_streams = NULL;
p_sys->i_width = i_width;
p_sys->i_height = i_height;
p_sys->i_chroma = i_chroma;
@@ -522,7 +522,7 @@ static int CommonOpen( vlc_object_t *p_this, access_sys_t *p_sys,
{
/* Check if we can handle the demuxing ourselves or need to spawn
* a demuxer module */
- dshow_stream_t *p_stream = p_sys->pp_streams[p_sys->i_streams-1];
+ dshow_stream_t *p_stream = *(p_sys->pp_streams.rbegin());
if( p_stream->mt.majortype == MEDIATYPE_Video )
{
@@ -647,7 +647,7 @@ static int CommonOpen( vlc_object_t *p_this, access_sys_t *p_sys,
/* Initialize some data */
p_sys->i_current_stream = 0;
- if( !p_sys->i_streams ) return VLC_EGENERIC;
+ if( p_sys->pp_streams.empty() ) return VLC_EGENERIC;
return VLC_SUCCESS;
}
@@ -680,9 +680,11 @@ static int DemuxOpen( vlc_object_t *p_this )
p_demux->info.i_title = 0;
p_demux->info.i_seekpoint = 0;
- for( int i = 0; i < p_sys->i_streams; i++ )
+ std::vector<dshow_stream_t*>::iterator it = p_sys->pp_streams.begin();
+ std::vector<dshow_stream_t*>::iterator end = p_sys->pp_streams.end();
+ for ( ; it != end; ++it )
{
- dshow_stream_t *p_stream = p_sys->pp_streams[i];
+ dshow_stream_t *p_stream = *it;
es_format_t fmt;
if( p_stream->mt.majortype == MEDIATYPE_Video )
@@ -794,8 +796,7 @@ static void CommonClose( vlc_object_t *p_this, access_sys_t *p_sys )
/* Uninitialize OLE/COM */
CoUninitialize();
- for( int i = 0; i < p_sys->i_streams; i++ ) delete p_sys->pp_streams[i];
- if( p_sys->i_streams ) free( p_sys->pp_streams );
+ vlc_delete_all( p_sys->pp_streams );
vlc_mutex_destroy( &p_sys->lock );
vlc_cond_destroy( &p_sys->wait );
@@ -950,10 +951,12 @@ static int OpenDevice( vlc_object_t *p_this, access_sys_t *p_sys,
std::string devicename, bool b_audio )
{
/* See if device is already opened */
- for( int i = 0; i < p_sys->i_streams; i++ )
+ std::vector<dshow_stream_t*>::iterator it = p_sys->pp_streams.begin();
+ std::vector<dshow_stream_t*>::iterator end = p_sys->pp_streams.end();
+ for ( ; it != end; ++it )
{
if( devicename.size() &&
- p_sys->pp_streams[i]->devicename == devicename )
+ (*it)->devicename == devicename )
{
/* Already opened */
return VLC_SUCCESS;
@@ -1129,10 +1132,7 @@ static int OpenDevice( vlc_object_t *p_this, access_sys_t *p_sys,
dshow_stream.p_device_filter = p_device_filter;
dshow_stream.p_capture_filter = p_capture_filter;
- p_sys->pp_streams = (dshow_stream_t **)xrealloc( p_sys->pp_streams,
- sizeof(dshow_stream_t *) * (p_sys->i_streams + 1) );
- p_sys->pp_streams[p_sys->i_streams] = new dshow_stream_t;
- *p_sys->pp_streams[p_sys->i_streams++] = dshow_stream;
+ p_sys->pp_streams.push_back( new dshow_stream_t(dshow_stream) );
return VLC_SUCCESS;
}
@@ -1749,9 +1749,11 @@ static int Demux( demux_t *p_demux )
while ( !i_found_samples )
{
/* Try to grab samples from all streams */
- for( int i_stream = 0; i_stream < p_sys->i_streams; i_stream++ )
+ std::vector<dshow_stream_t*>::iterator it = p_sys->pp_streams.begin();
+ std::vector<dshow_stream_t*>::iterator end = p_sys->pp_streams.end();
+ for ( ; it != end; ++it )
{
- dshow_stream_t *p_stream = p_sys->pp_streams[i_stream];
+ dshow_stream_t *p_stream = *it;
if( p_stream->p_capture_filter &&
p_stream->p_capture_filter->CustomGetPin()
->CustomGetSamples( p_stream->samples_queue ) == S_OK )
@@ -1773,10 +1775,12 @@ static int Demux( demux_t *p_demux )
vlc_mutex_unlock( &p_sys->lock );
- for ( int i_stream = 0; i_stream < p_sys->i_streams; i_stream++ )
+ std::vector<dshow_stream_t*>::iterator it = p_sys->pp_streams.begin();
+ std::vector<dshow_stream_t*>::iterator end = p_sys->pp_streams.end();
+ for ( ; it != end; ++it )
{
int i_samples;
- dshow_stream_t *p_stream = p_sys->pp_streams[i_stream];
+ dshow_stream_t *p_stream = *it;
i_samples = p_stream->samples_queue.size();
while ( i_samples > 0 )
More information about the vlc-commits
mailing list