source: trunk/Utilities/MediaFoundation/SinkWriterSetInputMediaType01/Application.cpp

Last change on this file was 632, checked in by roman, 8 years ago
File size: 3.0 KB
Line 
1#include "stdafx.h"
2
3#include <codecapi.h>
4#include <mfapi.h>
5#include <mfidl.h>
6#include <mfreadwrite.h>
7
8#pragma comment(lib, "mfuuid.lib")
9#pragma comment(lib, "mfplat.lib")
10#pragma comment(lib, "mfreadwrite.lib")
11
12#define __C ATLENSURE_SUCCEEDED
13
14int _tmain(int argc, _TCHAR* argv[])
15{
16        __C(CoInitialize(NULL));
17    __C(MFStartup(MF_VERSION, MFSTARTUP_FULL));
18        {
19                // NOTE: Tutorial: Using the Sink Writer to Encode Video https://msdn.microsoft.com/en-us/library/windows/desktop/ff819477
20
21                LPCWSTR pszPath = L"D:\\Temp.mp4";
22
23                // NOTE: MFCreateSinkWriterFromURL function https://msdn.microsoft.com/en-us/library/windows/desktop/dd388105
24                CComPtr<IMFSinkWriter> pSinkWriter;
25                __C(MFCreateSinkWriterFromURL(pszPath, NULL, NULL, &pSinkWriter));
26
27                const UINT32 nFrameWidth = 320;
28                const UINT32 nFrameHeight = 240;
29                const UINT32 nFrameRateNumerator = 30;
30                const UINT32 nFrameRateDenominator = 1;
31
32                // NOTE: H.264 Video Encoder https://msdn.microsoft.com/en-us/library/windows/desktop/dd797816
33                CComPtr<IMFMediaType> pMediaTypeOut;
34                __C(MFCreateMediaType(&pMediaTypeOut));
35                __C(pMediaTypeOut->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)); 
36                __C(pMediaTypeOut->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264));
37                __C(pMediaTypeOut->SetUINT32(MF_MT_AVG_BITRATE, 800000));
38                __C(pMediaTypeOut->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive)); 
39                __C(MFSetAttributeSize(pMediaTypeOut, MF_MT_FRAME_SIZE, nFrameWidth, nFrameHeight)); 
40                __C(MFSetAttributeRatio(pMediaTypeOut, MF_MT_FRAME_RATE, nFrameRateNumerator, nFrameRateDenominator));
41                __C(MFSetAttributeRatio(pMediaTypeOut, MF_MT_PIXEL_ASPECT_RATIO, 1, 1));
42                __C(pMediaTypeOut->SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH264VProfile_Main));
43
44                DWORD streamIndex; 
45                __C(pSinkWriter->AddStream(pMediaTypeOut, &streamIndex));
46
47                //const GUID Subtype = MFVideoFormat_RGB32;
48                const GUID Subtype = MFVideoFormat_YUY2;
49
50                CComPtr<IMFMediaType> pMediaTypeIn;
51                __C(MFCreateMediaType(&pMediaTypeIn)); 
52                __C(pMediaTypeIn->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video));   
53                __C(pMediaTypeIn->SetGUID(MF_MT_SUBTYPE, Subtype));
54                __C(pMediaTypeIn->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive));   
55                __C(pMediaTypeIn->SetUINT32(MF_MT_DEFAULT_STRIDE, 2 * nFrameWidth));   
56                UINT32 nSampleSize = 0;
57                __C(MFCalculateImageSize(Subtype, nFrameWidth, nFrameHeight, &nSampleSize));
58                __C(pMediaTypeIn->SetUINT32(MF_MT_SAMPLE_SIZE, nSampleSize));
59                __C(pMediaTypeIn->SetUINT32(MF_MT_FIXED_SIZE_SAMPLES, TRUE));
60                __C(pMediaTypeIn->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE));
61                __C(MFSetAttributeSize(pMediaTypeIn, MF_MT_FRAME_SIZE, nFrameWidth, nFrameHeight));   
62                __C(MFSetAttributeRatio(pMediaTypeIn, MF_MT_FRAME_RATE, nFrameRateNumerator, nFrameRateDenominator)); 
63                __C(MFSetAttributeRatio(pMediaTypeIn, MF_MT_PIXEL_ASPECT_RATIO, 1, 1));   
64
65                __C(pSinkWriter->SetInputMediaType(streamIndex, pMediaTypeIn, NULL));   
66                __C(pSinkWriter->BeginWriting());
67        }
68        return 0;
69}
70
Note: See TracBrowser for help on using the repository browser.