Quantcast
Channel: Intel® Software - Intel® Integrated Performance Primitives
Viewing all articles
Browse latest Browse all 1489

Problem with muxing MPEG2 video and audio

$
0
0

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


Viewing all articles
Browse latest Browse all 1489

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>