in FFmpegInterop/Source/FFmpegInteropMSS.cpp [602:657]
HRESULT FFmpegInteropMSS::CreateVideoStreamDescriptor(bool forceVideoDecode)
{
VideoEncodingProperties^ videoProperties;
if (avVideoCodecCtx->codec_id == AV_CODEC_ID_H264 && !forceVideoDecode)
{
videoProperties = VideoEncodingProperties::CreateH264();
videoProperties->ProfileId = avVideoCodecCtx->profile;
videoProperties->Height = avVideoCodecCtx->height;
videoProperties->Width = avVideoCodecCtx->width;
// Check for H264 bitstream flavor. H.264 AVC extradata starts with 1 while non AVC one starts with 0
if (avVideoCodecCtx->extradata != nullptr && avVideoCodecCtx->extradata_size > 0 && avVideoCodecCtx->extradata[0] == 1)
{
videoSampleProvider = ref new H264AVCSampleProvider(m_pReader, avFormatCtx, avVideoCodecCtx);
}
else
{
videoSampleProvider = ref new H264SampleProvider(m_pReader, avFormatCtx, avVideoCodecCtx);
}
}
else
{
videoProperties = VideoEncodingProperties::CreateUncompressed(MediaEncodingSubtypes::Nv12, avVideoCodecCtx->width, avVideoCodecCtx->height);
videoSampleProvider = ref new UncompressedVideoSampleProvider(m_pReader, avFormatCtx, avVideoCodecCtx);
if (avVideoCodecCtx->sample_aspect_ratio.num > 0 && avVideoCodecCtx->sample_aspect_ratio.den != 0)
{
videoProperties->PixelAspectRatio->Numerator = avVideoCodecCtx->sample_aspect_ratio.num;
videoProperties->PixelAspectRatio->Denominator = avVideoCodecCtx->sample_aspect_ratio.den;
}
videoProperties->Properties->Insert(MF_MT_INTERLACE_MODE, (uint32)_MFVideoInterlaceMode::MFVideoInterlace_MixedInterlaceOrProgressive);
}
if (rotateVideo)
{
Platform::Guid MF_MT_VIDEO_ROTATION(0xC380465D, 0x2271, 0x428C, 0x9B, 0x83, 0xEC, 0xEA, 0x3B, 0x4A, 0x85, 0xC1);
videoProperties->Properties->Insert(MF_MT_VIDEO_ROTATION, (uint32)rotationAngle);
}
// Detect the correct framerate
if (avVideoCodecCtx->framerate.num != 0 || avVideoCodecCtx->framerate.den != 1)
{
videoProperties->FrameRate->Numerator = avVideoCodecCtx->framerate.num;
videoProperties->FrameRate->Denominator = avVideoCodecCtx->framerate.den;
}
else if (avFormatCtx->streams[videoStreamIndex]->avg_frame_rate.num != 0 || avFormatCtx->streams[videoStreamIndex]->avg_frame_rate.den != 0)
{
videoProperties->FrameRate->Numerator = avFormatCtx->streams[videoStreamIndex]->avg_frame_rate.num;
videoProperties->FrameRate->Denominator = avFormatCtx->streams[videoStreamIndex]->avg_frame_rate.den;
}
videoProperties->Bitrate = (unsigned int)avVideoCodecCtx->bit_rate;
videoStreamDescriptor = ref new VideoStreamDescriptor(videoProperties);
return (videoStreamDescriptor != nullptr && videoSampleProvider != nullptr) ? S_OK : E_OUTOFMEMORY;
}