X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fdshow%2Ffilter.cpp;h=d061633d767726faa5a8593741bc0c76b97216c4;hb=66bd92014e5d721d8fe74bfd69f601bfd228012a;hp=88d8f2b78d100af48c07894bdd0a46c3e9394669;hpb=6ee1e193fd896ab9a4729fde14f009d9ce629815;p=vlc diff --git a/modules/access/dshow/filter.cpp b/modules/access/dshow/filter.cpp index 88d8f2b78d..d061633d76 100644 --- a/modules/access/dshow/filter.cpp +++ b/modules/access/dshow/filter.cpp @@ -25,8 +25,12 @@ * Preamble *****************************************************************************/ -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #ifndef _MSC_VER /* Work-around a bug in w32api-2.5 */ @@ -116,6 +120,7 @@ const GUID MEDIASUBTYPE_Y211 = {0x31313259, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0 const GUID MEDIASUBTYPE_YUY2 = {0x32595559, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; const GUID MEDIASUBTYPE_YVYU = {0x55595659, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; const GUID MEDIASUBTYPE_UYVY = {0x59565955, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; +const GUID MEDIASUBTYPE_HDYC = {0x43594448, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; /* Planar YUV formats */ const GUID MEDIASUBTYPE_YVU9 = {0x39555659, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; @@ -237,61 +242,67 @@ int GetFourCCFromMediaType( const AM_MEDIA_TYPE &media_type ) else if( media_type.subtype == MEDIASUBTYPE_RGB8 ) i_fourcc = VLC_FOURCC( 'R', 'G', 'B', '8' ); else if( media_type.subtype == MEDIASUBTYPE_RGB555 ) - i_fourcc = VLC_FOURCC( 'R', 'V', '1', '5' ); + i_fourcc = VLC_CODEC_RGB15; else if( media_type.subtype == MEDIASUBTYPE_RGB565 ) - i_fourcc = VLC_FOURCC( 'R', 'V', '1', '6' ); + i_fourcc = VLC_CODEC_RGB16; else if( media_type.subtype == MEDIASUBTYPE_RGB24 ) - i_fourcc = VLC_FOURCC( 'R', 'V', '2', '4' ); + i_fourcc = VLC_CODEC_RGB24; else if( media_type.subtype == MEDIASUBTYPE_RGB32 ) - i_fourcc = VLC_FOURCC( 'R', 'V', '3', '2' ); + i_fourcc = VLC_CODEC_RGB32; else if( media_type.subtype == MEDIASUBTYPE_ARGB32 ) - i_fourcc = VLC_FOURCC( 'R', 'G', 'B', 'A' ); + i_fourcc = VLC_CODEC_RGBA; /* Planar YUV formats */ else if( media_type.subtype == MEDIASUBTYPE_I420 ) - i_fourcc = VLC_FOURCC( 'I', '4', '2', '0' ); + i_fourcc = VLC_CODEC_I420; else if( media_type.subtype == MEDIASUBTYPE_Y41P ) - i_fourcc = VLC_FOURCC( 'I', '4', '1', '1' ); + i_fourcc = VLC_CODEC_I411; else if( media_type.subtype == MEDIASUBTYPE_YV12 ) - i_fourcc = VLC_FOURCC( 'Y', 'V', '1', '2' ); + i_fourcc = VLC_CODEC_YV12; else if( media_type.subtype == MEDIASUBTYPE_IYUV ) - i_fourcc = VLC_FOURCC( 'Y', 'V', '1', '2' ); + i_fourcc = VLC_CODEC_YV12; else if( media_type.subtype == MEDIASUBTYPE_YVU9 ) - i_fourcc = VLC_FOURCC( 'Y', 'V', 'U', '9' ); + i_fourcc = VLC_CODEC_I410; /* Packed YUV formats */ else if( media_type.subtype == MEDIASUBTYPE_YVYU ) - i_fourcc = VLC_FOURCC( 'Y', 'V', 'Y', 'U' ); + i_fourcc = VLC_CODEC_YVYU; else if( media_type.subtype == MEDIASUBTYPE_YUYV ) - i_fourcc = VLC_FOURCC( 'Y', 'U', 'Y', '2' ); + i_fourcc = VLC_CODEC_YUYV; else if( media_type.subtype == MEDIASUBTYPE_Y411 ) i_fourcc = VLC_FOURCC( 'I', '4', '1', 'N' ); else if( media_type.subtype == MEDIASUBTYPE_Y211 ) - i_fourcc = VLC_FOURCC( 'Y', '2', '1', '1' ); + i_fourcc = VLC_CODEC_Y211; else if( media_type.subtype == MEDIASUBTYPE_YUY2 ) - i_fourcc = VLC_FOURCC( 'Y', 'U', 'Y', '2' ); + i_fourcc = VLC_CODEC_YUYV; else if( media_type.subtype == MEDIASUBTYPE_UYVY ) - i_fourcc = VLC_FOURCC( 'U', 'Y', 'V', 'Y' ); + i_fourcc = VLC_CODEC_UYVY; + /* HDYC uses UYVY sample positions but Rec709 colourimetry */ + /* FIXME: When VLC understands colourspace, something will need + * to be added / changed here. Until then, just make it behave + * like UYVY */ + else if( media_type.subtype == MEDIASUBTYPE_HDYC ) + i_fourcc = VLC_CODEC_UYVY; /* MPEG2 video elementary stream */ else if( media_type.subtype == MEDIASUBTYPE_MPEG2_VIDEO ) - i_fourcc = VLC_FOURCC( 'm', 'p', '2', 'v' ); + i_fourcc = VLC_CODEC_MPGV; - /* DivX video */ + /* DivX video */ else if( media_type.subtype == MEDIASUBTYPE_DIVX ) - i_fourcc = VLC_FOURCC( 'D', 'I', 'V', 'X' ); + i_fourcc = VLC_CODEC_MP4V; /* DV formats */ else if( media_type.subtype == MEDIASUBTYPE_dvsl ) - i_fourcc = VLC_FOURCC( 'd', 'v', 's', 'l' ); + i_fourcc = VLC_CODEC_DV; else if( media_type.subtype == MEDIASUBTYPE_dvsd ) - i_fourcc = VLC_FOURCC( 'd', 'v', 's', 'd' ); + i_fourcc = VLC_CODEC_DV; else if( media_type.subtype == MEDIASUBTYPE_dvhd ) - i_fourcc = VLC_FOURCC( 'd', 'v', 'h', 'd' ); + i_fourcc = VLC_CODEC_DV; /* MJPEG format */ else if( media_type.subtype == MEDIASUBTYPE_MJPG ) - i_fourcc = VLC_FOURCC( 'M', 'J', 'P', 'G' ); + i_fourcc = VLC_CODEC_MJPG; } } @@ -303,7 +314,7 @@ int GetFourCCFromMediaType( const AM_MEDIA_TYPE &media_type ) if( media_type.subtype == MEDIASUBTYPE_PCM ) i_fourcc = VLC_FOURCC( 'a', 'r', 'a', 'w' ); else if( media_type.subtype == MEDIASUBTYPE_IEEE_FLOAT ) - i_fourcc = VLC_FOURCC( 'f', 'l', '3', '2' ); + i_fourcc = VLC_CODEC_FL32; } } else if( media_type.majortype == MEDIATYPE_Stream ) @@ -347,21 +358,49 @@ CapturePin::~CapturePin() FreeMediaType(cx_media_type); } +/** + * Returns the complete queue of samples that have been received so far. + * Lock the p_sys->lock before calling this function. + * @param samples_queue [out] Empty queue that will get all elements from + * the pin queue. + * @return S_OK if a sample was available, S_FALSE if no sample was + * available + */ +HRESULT CapturePin::CustomGetSamples( deque &external_queue ) +{ +#if 0 //def DEBUG_DSHOW + msg_Dbg( p_input, "CapturePin::CustomGetSamples: %d samples in the queue", samples_queue.size()); +#endif + + if( !samples_queue.empty() ) + { + external_queue.swap(samples_queue); + return S_OK; + } + return S_FALSE; +} + +/** + * Returns a sample from its sample queue. Proper locking must be done prior + * to this call. Current dshow code protects the access to any sample queue + * (audio and video) with the p_sys->lock + * @param vlc_sample [out] Address of a sample if sucessfull. Undefined + * otherwise. + * @return S_OK if a sample was available, S_FALSE if no sample was + * available + */ HRESULT CapturePin::CustomGetSample( VLCMediaSample *vlc_sample ) { #if 0 //def DEBUG_DSHOW msg_Dbg( p_input, "CapturePin::CustomGetSample" ); #endif - vlc_mutex_lock( &p_sys->lock ); if( samples_queue.size() ) { *vlc_sample = samples_queue.back(); samples_queue.pop_back(); - vlc_mutex_unlock( &p_sys->lock ); return S_OK; } - vlc_mutex_unlock( &p_sys->lock ); return S_FALSE; }