Media Foundation学习笔记(三)Media Foundation的架构 基本对象类型

基本对象类型

 

 

Attributes

 

一个Attribute就是一个“键”-“值”对,其中“键”是一个GUID,“值”是一个PROPVARIANT。在Media Foundation中,Attributes被广泛地用于配置对象、描述媒体格式、查询对象属性和其他目的。

“值”只能是这7种类型:UINT32、UINT64、64-bits浮点数、GUID、null结尾的宽字符串、字节数组和IUnknown指针,被定义在MF_ATTRIBUTE_TYPE中:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. typedefenum _MF_ATTRIBUTE_TYPE {   
  2.   MF_ATTRIBUTE_UINT32    = VT_UI4,  
  3.   MF_ATTRIBUTE_UINT64    = VT_UI8,  
  4.   MF_ATTRIBUTE_DOUBLE    = VT_R8,  
  5.   MF_ATTRIBUTE_GUID      = VT_CLSID,  
  6.   MF_ATTRIBUTE_STRING    = VT_LPWSTR,  
  7.   MF_ATTRIBUTE_BLOB      = VT_VECTOR | VT_UI1,  
  8.   MF_ATTRIBUTE_IUNKNOWN  = VT_UNKNOWN  
  9. } MF_ATTRIBUTE_TYPE;  

IMFAttributes口:设置和获取Attribute。例如:IMFAttributes::SetUINT32

MFCreateAttributes:创建一个空的Attribute

创建、设置和读取Attribute的例子:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;">externconst GUID MY_ATTRIBUTE;  
  2.   
  3. HRESULT ShowCreateAttributeStore(IMFAttributes **ppAttributes)  
  4. {  
  5.     IMFAttributes *pAttributes = NULL;  
  6. const UINT32 cElements = 10;  // Starting size.  
  7.   
  8. // Create the empty attribute store.  
  9.     HRESULT hr = MFCreateAttributes(&pAttributes, cElements);  
  10.   
  11. // Set the MY_ATTRIBUTE attribute with a string value.  
  12. if (SUCCEEDED(hr))  
  13.     {  
  14.         hr = pAttributes->SetString(  
  15.             MY_ATTRIBUTE,  
  16.             L"This is a string value"  
  17.             );  
  18.     }  
  19.   
  20. // Return the IMFAttributes pointer to the caller.  
  21. if (SUCCEEDED(hr))  
  22.     {  
  23.         *ppAttributes = pAttributes;  
  24.         (*ppAttributes)->AddRef();  
  25.     }  
  26.   
  27.     SAFE_RELEASE(pAttributes);  
  28.   
  29. return hr;  
  30. }  
  31.   
  32. HRESULT ShowGetAttributes()  
  33. {  
  34.     IMFAttributes *pAttributes = NULL;  
  35.     WCHAR *pwszValue = NULL;  
  36.     UINT32 cchLength = 0;  
  37.   
  38. // Create the attribute store.  
  39.     HRESULT hr = ShowCreateAttributeStore(&pAttributes);  
  40.   
  41. // Get the attribute.  
  42. if (SUCCEEDED(hr))  
  43.     {  
  44.         hr = pAttributes->GetAllocatedString(  
  45.             MY_ATTRIBUTE,  
  46. &pwszValue,  
  47. &cchLength  
  48.             );  
  49.     }  
  50.   
  51.     CoTaskMemFree(pwszValue);  
  52.     SAFE_RELEASE(pAttributes);  
  53.   
  54. return hr;  
  55. }  
  56. </span>  

 

序列化Attribute

序列化为字节数组:使用MFGetAttributesAsBlobMFInitAttributesFromBlob

序列化到一个实现了Istream接口的stream对象:使用MFSerializeAttributesToStreamMFDeserializeAttributesFromStream


 

Media Types

 

Media Type描述了媒体流的格式。类似DShow中的AM_MEDIA_TYPE

 

接口:IMFMediaType。这个接口从IMFAttributes继承而来。

 

MFCreateMediaType:创建一个新的MediaType。新的MediaType没有任何Attributes。

 

Media Type一些通用Attributes:

1.“键”MF_MT_MAJOR_TYPE:类似Dshow的AM_MEDIA_TYPE结构体中的majortype成员;“值”MFMediaType_Video类似Dshow的MEDIATYPE_Video

2. “键”MF_MT_SUBTYPE类似Dshow的AM_MEDIA_TYPE结构体中的subtype成员;“值”MFVideoFormat_RGB24类似Dshow的MEDIASUBTYPE_H264

 

Dshow中的媒体类型结构体和Media Foundation中的Media Type的转换:

 

AM_MEDIA_TYPE转MediaType互:MFInitMediaTypeFromAMMediaType

BITMAPINFOHEADER转Media Type:MFCreateVideoMediaTypeFromBitMapInfoHeaderEx

VIDEOINFOHEADER转Media Type:MFInitMediaTypeFromVideoInfoHeader

VIDEOINFOHEADER2转Media Type:MFInitMediaTypeFromVideoInfoHeader2

WAVEFORMATEXWAVEFORMATEXTENSIBLE转Media Type:MFInitMediaTypeFromWaveFormatEx

 

MediaType转AM_MEDIA_TYPEIMFMediaType::GetRepresentationMFCreateAMMediaTypeFromMFMediaTypeMFInitAMMediaTypeFromMFMediaType

MediaType转VIDEOINFOHEADERVIDEOINFOHEADER2IMFMediaType::GetRepresentation

MediaType转WAVEFORMATEXWAVEFORMATEXTENSIBLEMFCreateWaveFormatExFromMFMediaType

 

Dshow中的媒体类型结构体成员和Media Foundation中的Attributes的对应关系:

 

AM_MEDIA_TYPE结构体:

Member

Attribute

bTemporalCompression

MF_MT_ALL_SAMPLES_INDEPENDENT

bFixedSizeSamples

MF_MT_FIXED_SIZE_SAMPLES

lSampleSize

MF_MT_SAMPLE_SIZE

WAVEFORMATEX, WAVEFORMATEXTENSIBLE结构体:

Member

Attribute

wFormatTag

MF_MT_SUBTYPE If wFormatTag is WAVE_FORMAT_EXTENSIBLE, the subtype is found in the SubFormat member.

nChannels

MF_MT_AUDIO_NUM_CHANNELS

nSamplesPerSec

MF_MT_AUDIO_SAMPLES_PER_SECOND

nAvgBytesPerSec

MF_MT_AUDIO_AVG_BYTES_PER_SECOND

nBlockAlign

MF_MT_AUDIO_BLOCK_ALIGNMENT

wBitsPerSample

MF_MT_AUDIO_BITS_PER_SAMPLE

wValidBitsPerSample

MF_MT_AUDIO_VALID_BITS_PER_SAMPLE

wSamplesPerBlock

MF_MT_AUDIO_SAMPLES_PER_BLOCK

dwChannelMask

MF_MT_AUDIO_CHANNEL_MASK

SubFormat

MF_MT_SUBTYPE

Extra data

MF_MT_USER_DATA


VIDEOINFOHEADER, VIDEOINFOHEADER2结构体:

Member

Attribute

dwBitRate

MF_MT_AVG_BITRATE

dwBitErrorRate

MF_MT_AVG_BIT_ERROR_RATE

AvgTimePerFrame

MF_MT_FRAME_RATE; useMFAverageTimePerFrameToFrameRate to calculate this value.

dwInterlaceFlags

MF_MT_INTERLACE_MODE

dwCopyProtectFlags

No defined equivalent

dwPictAspectRatioX, dwPictAspectRatioY

MF_MT_PIXEL_ASPECT_RATIO; must convert from picture aspect ratio to picture aspect ratio.

dwControlFlags

MF_MT_PAD_CONTROL_FLAGS. If the AMCONTROL_COLORINFO_PRESENT flag is present, set the extended color attributes described in Extended Color Information.

bmiHeader.biWidth, bmiHeader.biHeight

MF_MT_FRAME_SIZE

bmiHeader.biBitCount

Implicit in the subtype (MF_MT_SUBTYPE).

bmiHeader.biCompression

Implicit in the subtype.

bmiHeader.biSizeImage

MF_MT_SAMPLE_SIZE

Palette information

MF_MT_PALETTE

The following attributes can be inferred from theVIDEOINFOHEADER orVIDEOINFOHEADER2 structure but also require some knowledge of the format details. For example, different YUV formats have different stride requirements.

MF_MT_DEFAULT_STRIDE

MF_MT_MINIMUM_DISPLAY_APERTURE

MF_MT_PAN_SCAN_APERTURE

 

一些有用的针对Media Type对象的函数:

 

 

MFAverageTimePerFrameToFrameRate

Calculates the frame rate from the average duration of a video frame.

MFCalculateImageSize

Retrieves the image size for an uncompressed video format.

MFCompareFullToPartialMediaType

Compares a full media type to a partial media type.

MFCreateMediaType

Creates an empty media type.

MFFrameRateToAverageTimePerFrame

Converts a video frame rate into a frame duration.

MFGetStrideForBitmapInfoHeader

Retrieves the minimum surface stride for a video format.

MFIsFormatYUV

Queries whether a FOURCC code orD3DFORMAT value is a YUV format.

MFValidateMediaTypeSize

Validates the size of a buffer for a video format block.

MFWrapMediaType

Creates a media type that wraps another media type.

 

调试打印Media Type对象的函数:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #include <strsafe.h>  
  2.   
  3. LPCWSTR GetGUIDNameConst(const GUID& guid);  
  4. HRESULT GetGUIDName(const GUID& guid, WCHAR **ppwsz);  
  5.   
  6. HRESULT LogAttributeValueByIndex(IMFAttributes *pAttr, DWORD index);  
  7. HRESULT SpecialCaseAttributeValue(GUID guid, const PROPVARIANT& var);  
  8.   
  9. void DBGMSG(PCWSTR format, ...);  
  10.   
  11. HRESULT LogMediaType(IMFMediaType *pType)  
  12. {  
  13.     UINT32 count = 0;  
  14.   
  15.     HRESULT hr = pType->GetCount(&count);  
  16. if (FAILED(hr))  
  17.     {  
  18. return hr;  
  19.     }  
  20.   
  21. if (count == 0)  
  22.     {  
  23.         DBGMSG(L"Empty media type.\n");  
  24.     }  
  25.   
  26. for (UINT32 i = 0; i < count; i++)  
  27.     {  
  28.         hr = LogAttributeValueByIndex(pType, i);  
  29. if (FAILED(hr))  
  30.         {  
  31. break;  
  32.         }  
  33.     }  
  34. return hr;  
  35. }  
  36.   
  37. HRESULT LogAttributeValueByIndex(IMFAttributes *pAttr, DWORD index)  
  38. {  
  39.     WCHAR *pGuidName = NULL;  
  40.     WCHAR *pGuidValName = NULL;  
  41.   
  42.     GUID guid = { 0 };  
  43.   
  44.     PROPVARIANT var;  
  45.     PropVariantInit(&var);  
  46.   
  47.     HRESULT hr = pAttr->GetItemByIndex(index, &guid, &var);  
  48. if (FAILED(hr))  
  49.     {  
  50. goto done;  
  51.     }  
  52.   
  53.     hr = GetGUIDName(guid, &pGuidName);  
  54. if (FAILED(hr))  
  55.     {  
  56. goto done;  
  57.     }  
  58.   
  59.     DBGMSG(L"\t%s\t", pGuidName);  
  60.   
  61.     hr = SpecialCaseAttributeValue(guid, var);  
  62. if (FAILED(hr))  
  63.     {  
  64. goto done;  
  65.     }  
  66. if (hr == S_FALSE)  
  67.     {  
  68. switch (var.vt)  
  69.         {  
  70. case VT_UI4:  
  71.             DBGMSG(L"%d", var.ulVal);  
  72. break;  
  73.   
  74. case VT_UI8:  
  75.             DBGMSG(L"%I64d", var.uhVal);  
  76. break;  
  77.   
  78. case VT_R8:  
  79.             DBGMSG(L"%f", var.dblVal);  
  80. break;  
  81.   
  82. case VT_CLSID:  
  83.             hr = GetGUIDName(*var.puuid, &pGuidValName);  
  84. if (SUCCEEDED(hr))  
  85.             {  
  86.                 DBGMSG(pGuidValName);  
  87.             }  
  88. break;  
  89.   
  90. case VT_LPWSTR:  
  91.             DBGMSG(var.pwszVal);  
  92. break;  
  93.   
  94. case VT_VECTOR | VT_UI1:  
  95.             DBGMSG(L"<<byte array>>");  
  96. break;  
  97.   
  98. case VT_UNKNOWN:  
  99.             DBGMSG(L"IUnknown");  
  100. break;  
  101.   
  102. default:  
  103.             DBGMSG(L"Unexpected attribute type (vt = %d)", var.vt);  
  104. break;  
  105.         }  
  106.     }  
  107.   
  108. done:  
  109.     DBGMSG(L"\n");  
  110.     CoTaskMemFree(pGuidName);  
  111.     CoTaskMemFree(pGuidValName);  
  112.     PropVariantClear(&var);  
  113. return hr;  
  114. }  
  115.   
  116. HRESULT GetGUIDName(const GUID& guid, WCHAR **ppwsz)  
  117. {  
  118.     HRESULT hr = S_OK;  
  119.     WCHAR *pName = NULL;  
  120.   
  121.     LPCWSTR pcwsz = GetGUIDNameConst(guid);  
  122. if (pcwsz)  
  123.     {  
  124.         size_t cchLength = 0;  
  125.   
  126.         hr = StringCchLength(pcwsz, STRSAFE_MAX_CCH, &cchLength);  
  127. if (FAILED(hr))  
  128.         {  
  129. goto done;  
  130.         }  
  131.   
  132.         pName = (WCHAR*)CoTaskMemAlloc((cchLength + 1) * sizeof(WCHAR));  
  133.   
  134. if (pName == NULL)  
  135.         {  
  136.             hr = E_OUTOFMEMORY;  
  137. goto done;  
  138.         }  
  139.   
  140.         hr = StringCchCopy(pName, cchLength + 1, pcwsz);  
  141. if (FAILED(hr))  
  142.         {  
  143. goto done;  
  144.         }  
  145.     }  
  146. else  
  147.     {  
  148.         hr = StringFromCLSID(guid, &pName);  
  149.     }  
  150.   
  151. done:  
  152. if (FAILED(hr))  
  153.     {  
  154.         *ppwsz = NULL;  
  155.         CoTaskMemFree(pName);  
  156.     }  
  157. else  
  158.     {  
  159.         *ppwsz = pName;  
  160.     }  
  161. return hr;  
  162. }  
  163.   
  164. void LogUINT32AsUINT64(const PROPVARIANT& var)  
  165. {  
  166.     UINT32 uHigh = 0, uLow = 0;  
  167.     Unpack2UINT32AsUINT64(var.uhVal.QuadPart, &uHigh, &uLow);  
  168.     DBGMSG(L"%d x %d", uHigh, uLow);  
  169. }  
  170.   
  171. float OffsetToFloat(const MFOffset& offset)  
  172. {  
  173. return offset.value + (static_cast<float>(offset.fract) / 65536.0f);  
  174. }  
  175.   
  176. HRESULT LogVideoArea(const PROPVARIANT& var)  
  177. {  
  178. if (var.caub.cElems <sizeof(MFVideoArea))  
  179.     {  
  180. return MF_E_BUFFERTOOSMALL;  
  181.     }  
  182.   
  183.     MFVideoArea *pArea = (MFVideoArea*)var.caub.pElems;  
  184.   
  185.     DBGMSG(L"(%f,%f) (%d,%d)", OffsetToFloat(pArea->OffsetX), OffsetToFloat(pArea->OffsetY),   
  186.         pArea->Area.cx, pArea->Area.cy);  
  187. return S_OK;  
  188. }  
  189.   
  190. // Handle certain known special cases.  
  191. HRESULT SpecialCaseAttributeValue(GUID guid, const PROPVARIANT& var)  
  192. {  
  193. if ((guid == MF_MT_FRAME_RATE) || (guid == MF_MT_FRAME_RATE_RANGE_MAX) ||  
  194.         (guid == MF_MT_FRAME_RATE_RANGE_MIN) || (guid == MF_MT_FRAME_SIZE) ||  
  195.         (guid == MF_MT_PIXEL_ASPECT_RATIO))  
  196.     {  
  197. // Attributes that contain two packed 32-bit values.  
  198.         LogUINT32AsUINT64(var);  
  199.     }  
  200. elseif ((guid == MF_MT_GEOMETRIC_APERTURE) ||   
  201.              (guid == MF_MT_MINIMUM_DISPLAY_APERTURE) ||   
  202.              (guid == MF_MT_PAN_SCAN_APERTURE))  
  203.     {  
  204. // Attributes that an MFVideoArea structure.  
  205. return LogVideoArea(var);  
  206.     }  
  207. else  
  208.     {  
  209. return S_FALSE;  
  210.     }  
  211. return S_OK;  
  212. }  
  213.   
  214. void DBGMSG(PCWSTR format, ...)  
  215. {  
  216.     va_list args;  
  217.     va_start(args, format);  
  218.   
  219.     WCHAR msg[MAX_PATH];  
  220.   
  221. if (SUCCEEDED(StringCbVPrintf(msg, sizeof(msg), format, args)))  
  222.     {  
  223.         OutputDebugString(msg);  
  224.     }  
  225. }  
  226.   
  227. #ifndef IF_EQUAL_RETURN  
  228. #define IF_EQUAL_RETURN(param, val) if(val == param) return L#val  
  229. #endif  
  230.   
  231. LPCWSTR GetGUIDNameConst(const GUID& guid)  
  232. {  
  233.     IF_EQUAL_RETURN(guid, MF_MT_MAJOR_TYPE);  
  234.     IF_EQUAL_RETURN(guid, MF_MT_MAJOR_TYPE);  
  235.     IF_EQUAL_RETURN(guid, MF_MT_SUBTYPE);  
  236.     IF_EQUAL_RETURN(guid, MF_MT_ALL_SAMPLES_INDEPENDENT);  
  237.     IF_EQUAL_RETURN(guid, MF_MT_FIXED_SIZE_SAMPLES);  
  238.     IF_EQUAL_RETURN(guid, MF_MT_COMPRESSED);  
  239.     IF_EQUAL_RETURN(guid, MF_MT_SAMPLE_SIZE);  
  240.     IF_EQUAL_RETURN(guid, MF_MT_WRAPPED_TYPE);  
  241.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_NUM_CHANNELS);  
  242.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_SAMPLES_PER_SECOND);  
  243.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_FLOAT_SAMPLES_PER_SECOND);  
  244.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_AVG_BYTES_PER_SECOND);  
  245.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_BLOCK_ALIGNMENT);  
  246.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_BITS_PER_SAMPLE);  
  247.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_VALID_BITS_PER_SAMPLE);  
  248.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_SAMPLES_PER_BLOCK);  
  249.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_CHANNEL_MASK);  
  250.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_FOLDDOWN_MATRIX);  
  251.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_PEAKREF);  
  252.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_PEAKTARGET);  
  253.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_AVGREF);  
  254.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_AVGTARGET);  
  255.     IF_EQUAL_RETURN(guid, MF_MT_AUDIO_PREFER_WAVEFORMATEX);  
  256.     IF_EQUAL_RETURN(guid, MF_MT_AAC_PAYLOAD_TYPE);  
  257.     IF_EQUAL_RETURN(guid, MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION);  
  258.     IF_EQUAL_RETURN(guid, MF_MT_FRAME_SIZE);  
  259.     IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE);  
  260.     IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE_RANGE_MAX);  
  261.     IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE_RANGE_MIN);  
  262.     IF_EQUAL_RETURN(guid, MF_MT_PIXEL_ASPECT_RATIO);  
  263.     IF_EQUAL_RETURN(guid, MF_MT_DRM_FLAGS);  
  264.     IF_EQUAL_RETURN(guid, MF_MT_PAD_CONTROL_FLAGS);  
  265.     IF_EQUAL_RETURN(guid, MF_MT_SOURCE_CONTENT_HINT);  
  266.     IF_EQUAL_RETURN(guid, MF_MT_VIDEO_CHROMA_SITING);  
  267.     IF_EQUAL_RETURN(guid, MF_MT_INTERLACE_MODE);  
  268.     IF_EQUAL_RETURN(guid, MF_MT_TRANSFER_FUNCTION);  
  269.     IF_EQUAL_RETURN(guid, MF_MT_VIDEO_PRIMARIES);  
  270.     IF_EQUAL_RETURN(guid, MF_MT_CUSTOM_VIDEO_PRIMARIES);  
  271.     IF_EQUAL_RETURN(guid, MF_MT_YUV_MATRIX);  
  272.     IF_EQUAL_RETURN(guid, MF_MT_VIDEO_LIGHTING);  
  273.     IF_EQUAL_RETURN(guid, MF_MT_VIDEO_NOMINAL_RANGE);  
  274.     IF_EQUAL_RETURN(guid, MF_MT_GEOMETRIC_APERTURE);  
  275.     IF_EQUAL_RETURN(guid, MF_MT_MINIMUM_DISPLAY_APERTURE);  
  276.     IF_EQUAL_RETURN(guid, MF_MT_PAN_SCAN_APERTURE);  
  277.     IF_EQUAL_RETURN(guid, MF_MT_PAN_SCAN_ENABLED);  
  278.     IF_EQUAL_RETURN(guid, MF_MT_AVG_BITRATE);  
  279.     IF_EQUAL_RETURN(guid, MF_MT_AVG_BIT_ERROR_RATE);  
  280.     IF_EQUAL_RETURN(guid, MF_MT_MAX_KEYFRAME_SPACING);  
  281.     IF_EQUAL_RETURN(guid, MF_MT_DEFAULT_STRIDE);  
  282.     IF_EQUAL_RETURN(guid, MF_MT_PALETTE);  
  283.     IF_EQUAL_RETURN(guid, MF_MT_USER_DATA);  
  284.     IF_EQUAL_RETURN(guid, MF_MT_AM_FORMAT_TYPE);  
  285.     IF_EQUAL_RETURN(guid, MF_MT_MPEG_START_TIME_CODE);  
  286.     IF_EQUAL_RETURN(guid, MF_MT_MPEG2_PROFILE);  
  287.     IF_EQUAL_RETURN(guid, MF_MT_MPEG2_LEVEL);  
  288.     IF_EQUAL_RETURN(guid, MF_MT_MPEG2_FLAGS);  
  289.     IF_EQUAL_RETURN(guid, MF_MT_MPEG_SEQUENCE_HEADER);  
  290.     IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_SRC_PACK_0);  
  291.     IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_CTRL_PACK_0);  
  292.     IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_SRC_PACK_1);  
  293.     IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_CTRL_PACK_1);  
  294.     IF_EQUAL_RETURN(guid, MF_MT_DV_VAUX_SRC_PACK);  
  295.     IF_EQUAL_RETURN(guid, MF_MT_DV_VAUX_CTRL_PACK);  
  296.     IF_EQUAL_RETURN(guid, MF_MT_ARBITRARY_HEADER);  
  297.     IF_EQUAL_RETURN(guid, MF_MT_ARBITRARY_FORMAT);  
  298.     IF_EQUAL_RETURN(guid, MF_MT_IMAGE_LOSS_TOLERANT);   
  299.     IF_EQUAL_RETURN(guid, MF_MT_MPEG4_SAMPLE_DESCRIPTION);  
  300.     IF_EQUAL_RETURN(guid, MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY);  
  301.     IF_EQUAL_RETURN(guid, MF_MT_ORIGINAL_4CC);   
  302.     IF_EQUAL_RETURN(guid, MF_MT_ORIGINAL_WAVE_FORMAT_TAG);  
  303.   
  304. // Media types  
  305.   
  306.     IF_EQUAL_RETURN(guid, MFMediaType_Audio);  
  307.     IF_EQUAL_RETURN(guid, MFMediaType_Video);  
  308.     IF_EQUAL_RETURN(guid, MFMediaType_Protected);  
  309.     IF_EQUAL_RETURN(guid, MFMediaType_SAMI);  
  310.     IF_EQUAL_RETURN(guid, MFMediaType_Script);  
  311.     IF_EQUAL_RETURN(guid, MFMediaType_Image);  
  312.     IF_EQUAL_RETURN(guid, MFMediaType_HTML);  
  313.     IF_EQUAL_RETURN(guid, MFMediaType_Binary);  
  314.     IF_EQUAL_RETURN(guid, MFMediaType_FileTransfer);  
  315.   
  316.     IF_EQUAL_RETURN(guid, MFVideoFormat_AI44); //     FCC('AI44')  
  317.     IF_EQUAL_RETURN(guid, MFVideoFormat_ARGB32); //   D3DFMT_A8R8G8B8   
  318.     IF_EQUAL_RETURN(guid, MFVideoFormat_AYUV); //     FCC('AYUV')  
  319.     IF_EQUAL_RETURN(guid, MFVideoFormat_DV25); //     FCC('dv25')  
  320.     IF_EQUAL_RETURN(guid, MFVideoFormat_DV50); //     FCC('dv50')  
  321.     IF_EQUAL_RETURN(guid, MFVideoFormat_DVH1); //     FCC('dvh1')  
  322.     IF_EQUAL_RETURN(guid, MFVideoFormat_DVSD); //     FCC('dvsd')  
  323.     IF_EQUAL_RETURN(guid, MFVideoFormat_DVSL); //     FCC('dvsl')  
  324.     IF_EQUAL_RETURN(guid, MFVideoFormat_H264); //     FCC('H264')  
  325.     IF_EQUAL_RETURN(guid, MFVideoFormat_I420); //     FCC('I420')  
  326.     IF_EQUAL_RETURN(guid, MFVideoFormat_IYUV); //     FCC('IYUV')  
  327.     IF_EQUAL_RETURN(guid, MFVideoFormat_M4S2); //     FCC('M4S2')  
  328.     IF_EQUAL_RETURN(guid, MFVideoFormat_MJPG);  
  329.     IF_EQUAL_RETURN(guid, MFVideoFormat_MP43); //     FCC('MP43')  
  330.     IF_EQUAL_RETURN(guid, MFVideoFormat_MP4S); //     FCC('MP4S')  
  331.     IF_EQUAL_RETURN(guid, MFVideoFormat_MP4V); //     FCC('MP4V')  
  332.     IF_EQUAL_RETURN(guid, MFVideoFormat_MPG1); //     FCC('MPG1')  
  333.     IF_EQUAL_RETURN(guid, MFVideoFormat_MSS1); //     FCC('MSS1')  
  334.     IF_EQUAL_RETURN(guid, MFVideoFormat_MSS2); //     FCC('MSS2')  
  335.     IF_EQUAL_RETURN(guid, MFVideoFormat_NV11); //     FCC('NV11')  
  336.     IF_EQUAL_RETURN(guid, MFVideoFormat_NV12); //     FCC('NV12')  
  337.     IF_EQUAL_RETURN(guid, MFVideoFormat_P010); //     FCC('P010')  
  338.     IF_EQUAL_RETURN(guid, MFVideoFormat_P016); //     FCC('P016')  
  339.     IF_EQUAL_RETURN(guid, MFVideoFormat_P210); //     FCC('P210')  
  340.     IF_EQUAL_RETURN(guid, MFVideoFormat_P216); //     FCC('P216')  
  341.     IF_EQUAL_RETURN(guid, MFVideoFormat_RGB24); //    D3DFMT_R8G8B8   
  342.     IF_EQUAL_RETURN(guid, MFVideoFormat_RGB32); //    D3DFMT_X8R8G8B8   
  343.     IF_EQUAL_RETURN(guid, MFVideoFormat_RGB555); //   D3DFMT_X1R5G5B5   
  344.     IF_EQUAL_RETURN(guid, MFVideoFormat_RGB565); //   D3DFMT_R5G6B5   
  345.     IF_EQUAL_RETURN(guid, MFVideoFormat_RGB8);  
  346.     IF_EQUAL_RETURN(guid, MFVideoFormat_UYVY); //     FCC('UYVY')  
  347.     IF_EQUAL_RETURN(guid, MFVideoFormat_v210); //     FCC('v210')  
  348.     IF_EQUAL_RETURN(guid, MFVideoFormat_v410); //     FCC('v410')  
  349.     IF_EQUAL_RETURN(guid, MFVideoFormat_WMV1); //     FCC('WMV1')  
  350.     IF_EQUAL_RETURN(guid, MFVideoFormat_WMV2); //     FCC('WMV2')  
  351.     IF_EQUAL_RETURN(guid, MFVideoFormat_WMV3); //     FCC('WMV3')  
  352.     IF_EQUAL_RETURN(guid, MFVideoFormat_WVC1); //     FCC('WVC1')  
  353.     IF_EQUAL_RETURN(guid, MFVideoFormat_Y210); //     FCC('Y210')  
  354.     IF_EQUAL_RETURN(guid, MFVideoFormat_Y216); //     FCC('Y216')  
  355.     IF_EQUAL_RETURN(guid, MFVideoFormat_Y410); //     FCC('Y410')  
  356.     IF_EQUAL_RETURN(guid, MFVideoFormat_Y416); //     FCC('Y416')  
  357.     IF_EQUAL_RETURN(guid, MFVideoFormat_Y41P);  
  358.     IF_EQUAL_RETURN(guid, MFVideoFormat_Y41T);  
  359.     IF_EQUAL_RETURN(guid, MFVideoFormat_YUY2); //     FCC('YUY2')  
  360.     IF_EQUAL_RETURN(guid, MFVideoFormat_YV12); //     FCC('YV12')  
  361.     IF_EQUAL_RETURN(guid, MFVideoFormat_YVYU);  
  362.   
  363.     IF_EQUAL_RETURN(guid, MFAudioFormat_PCM); //              WAVE_FORMAT_PCM   
  364.     IF_EQUAL_RETURN(guid, MFAudioFormat_Float); //            WAVE_FORMAT_IEEE_FLOAT   
  365.     IF_EQUAL_RETURN(guid, MFAudioFormat_DTS); //              WAVE_FORMAT_DTS   
  366.     IF_EQUAL_RETURN(guid, MFAudioFormat_Dolby_AC3_SPDIF); //  WAVE_FORMAT_DOLBY_AC3_SPDIF   
  367.     IF_EQUAL_RETURN(guid, MFAudioFormat_DRM); //              WAVE_FORMAT_DRM   
  368.     IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV8); //        WAVE_FORMAT_WMAUDIO2   
  369.     IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV9); //        WAVE_FORMAT_WMAUDIO3   
  370.     IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudio_Lossless); // WAVE_FORMAT_WMAUDIO_LOSSLESS   
  371.     IF_EQUAL_RETURN(guid, MFAudioFormat_WMASPDIF); //         WAVE_FORMAT_WMASPDIF   
  372.     IF_EQUAL_RETURN(guid, MFAudioFormat_MSP1); //             WAVE_FORMAT_WMAVOICE9   
  373.     IF_EQUAL_RETURN(guid, MFAudioFormat_MP3); //              WAVE_FORMAT_MPEGLAYER3   
  374.     IF_EQUAL_RETURN(guid, MFAudioFormat_MPEG); //             WAVE_FORMAT_MPEG   
  375.     IF_EQUAL_RETURN(guid, MFAudioFormat_AAC); //              WAVE_FORMAT_MPEG_HEAAC   
  376.     IF_EQUAL_RETURN(guid, MFAudioFormat_ADTS); //             WAVE_FORMAT_MPEG_ADTS_AAC   
  377.   
  378. return NULL;  
  379. }  


 

Media Buffers

Media Buffer对象用于管理内存块,用于Pipeline组件之间移动数据。应用程序只有在开发pipeline组件和不通过Media Session直接使用Pipeline组件这2种情况下,才需要使用Media Buffer对象。

 

接口:IMFMediaBuffer

 

创建对象:MFCreateMemoryBuffer或者MFCreateAlignedMemoryBuffer

 

非压缩图像的缓冲区:对于Direct3D表面这样的非压缩图像,可以使用IMF2DBuffer接口。MFCreateDXSurfaceBuffer可以创建DirectX表面对象,该对象实现了IMFMediaBuffer和IMF2DBuffer接口。

 

 

Media Samples

 

一个MediaSample对象存储了一个视频帧或者一个音频帧。一个Media Sample包含了0个或者多个Buffer,例如:在.asf文件中,一个视频帧通常就是由多个asf包组成。

 

接口:IMFSample。

 

创建对象:MFCreateSample;

添加Buffer:IMFSample::AddBuffer。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值