Hi Intel Gurus,
I have a trouble to mux YUV420 video with audio to MPEG2. It's no issue to mux just the video. Works like a charm. But when I try to use PutAudioData I receive Unhandled exception error: Access violation reading location 0x0000000.
This is extraction from my code:
////////////////////////////
// Video Info
UMC::VideoStreamInfo VideoInfo;
memset(&VideoInfo, 0, sizeof(VideoInfo));
VideoInfo.streamPID = 0;
VideoInfo.stream_type = UMC::MPEG2_VIDEO;
VideoInfo.color_format = UMC::YUV420;
VideoInfo.interlace_type = UMC::PROGRESSIVE;
VideoInfo.aspect_ratio_height = 9;
VideoInfo.aspect_ratio_width = 16;
VideoInfo.clip_info.height = 1080;
VideoInfo.clip_info.width = 1920;
VideoInfo.bitrate = 10000000;
VideoInfo.framerate = 24;
VideoInfo.disp_clip_info.height = 1080;
VideoInfo.disp_clip_info.width = 1920;
//////////////////////////////
// Audio Info
UMC::AudioStreamInfo AudioInfo;
memset(&AudioInfo, 0, sizeof(AudioInfo));
AudioInfo.streamPID = 1;
AudioInfo.stream_type = UMC::AAC_AUDIO;
AudioInfo.channels = 2;
AudioInfo.bitPerSample = 16;
AudioInfo.bitrate = 24;
AudioInfo.sample_frequency = 44100;
UMC::MPEG2MuxerParams MuxerParams;
MuxerParams.m_lpDataWriter = &Writer;
MuxerParams.m_SystemType = UMC::MPEG2_PURE_VIDEO_STREAM;
MuxerParams.m_nNumberOfTracks = 2;
MuxerParams.pTrackParams = new UMC::TrackParams[MuxerParams.m_nNumberOfTracks];
// Track 1
MuxerParams.pTrackParams[0].type = UMC::VIDEO_TRACK;
MuxerParams.pTrackParams[0].info.video = &VideoInfo;
MuxerParams.pTrackParams[0].bufferParams.m_prefInputBufferSize = 2000000;
// Track 2
MuxerParams.pTrackParams[1].type = UMC::AUDIO_TRACK;
MuxerParams.pTrackParams[1].info.audio = &AudioInfo;
MuxerParams.pTrackParams[1].bufferParams.m_prefInputBufferSize = 20000000;
MuxerParams.pTrackParams[1].bufferParams.m_prefOutputBufferSize = 20000000;
UMC::MPEG2Muxer Muxer;
Muxer.Init(&MuxerParams);
/////////////////////////////////////////////
// MPEG2 Encoder - video
UMC::MPEG2EncoderParams videoParams;
videoParams.info.clip_info.height = 1080
videoParams.info.clip_info.width = 1920;
videoParams.info.bitrate = 1000000;
videoParams.info.color_format = UMC::YUV420;
videoParams.info.framerate = 24;
videoParams.info.stream_type = UMC::MPEG2_VIDEO;
videoParams.info.aspect_ratio_height = 9;
videoParams.info.aspect_ratio_width = 16;
videoParams.numThreads = 1;
UMC::MPEG2VideoEncoder Mpeg2Encoder;
Mpeg2Encoder.Init(&videoParams);
////////////////////////////////////////////
// AAC Encoder - audio
UMC::AACEncoderParams audioParams;
audioParams.ns_mode = 1;
audioParams.stereo_mode = UMC_AAC_JOINT_STEREO;
audioParams.m_info_in.channels = 2;
audioParams.m_info_in.sample_frequency = 44100;
audioParams.m_info_in.bitrate = 24000;
audioParams.audioObjectType = UMC::AOT_AAC_LC;
audioParams.outputFormat = UMC::UMC_AAC_ADTS;
audioParams.m_info_out.channels = 2;
audioParams.m_info_out.bitrate = 24000;
audioParams.m_info_out.sample_frequency = 44100;
UMC::AACEncoder AacEncoder;
AacEncoder.Init(&audioParams);
UMC::VideoData DataVideoIn;
DataVideoIn.Init( 1920, 1080, UMC::YUV420,8);
Ipp8u* pOutputVideoData = ippsMalloc_8u(3110400);
Ipp8u* pOutputAudioData = ippsMalloc_8u(4096);
UMC::MediaData DataVideoOut;
UMC::MediaData MuxVideoData;
UMC::AudioData DataAudioIn;
UMC::AudioData DataAudioOut;
UMC::MediaData MuxAudioData;
DWORD dwEvent;
int nEncodedVideoFrames = 0;
int nEncodedAudioFrames = 0;
//////////////////////////////////////////////////////
Now I use WaitForMultipleObjects to catch the video and buffers
///////////////////////////////////////////////
// Audio Part
UMC::Status status;
DataAudioIn.SetBufferPointer(pAudioFrameBuffer, nAudioBufferSize);
DataAudioIn.SetDataSize(nAudioBufferSize);
DataAudioOut.SetBufferPointer(pOutputAudioData, 100000000);
status = AacEncoder.GetFrame(&DataAudioIn, &DataAudioOut);
if (status == UMC::UMC_OK)
{
nEncodedAudioFrames++;
int nDataSize = DataAudioOut.GetDataSize();
MuxAudioData.SetBufferPointer(pOutputAudioData, nDataSize);
memcpy(MuxAudioData.GetDataPointer(), DataAudioOut.GetDataPointer(), nDataSize);
MuxAudioData.SetDataSize(nDataSize);
MuxAudioData.SetTime(nEncodedAudioFrames*((double)1.0)/(44100/1024.0));
do
{
status = Muxer.PutAudioData(&MuxAudioData); // I receive Unhandled exception right here
if (UMC::UMC_ERR_NOT_ENOUGH_BUFFER == status)
vm_time_sleep(5);
}while (UMC::UMC_ERR_NOT_ENOUGH_BUFFER == status);
}
Audio Part works fine with MPEG4 muxing. The difference only that during initialization I used parameters specific to MPEG4.
Thank you in advance
Sergey Tsybikov
Smith&Nephew