Intel® Integrated Performance Primitives
Deliberate problems developing high-performance vision, signal, security, and storage applications.

using MP4Muxer with H264 encoded Videodata

llt
Beginner
411 Views
Hello i have a monochrom (gray only) video.
Witch i can encode to a h264 video with the umc_video_enc_con without problems( VLC-Player plays it well ).
But i want a mp4 viedo witch can be played by Quicktime (and others).

So i found out that i have to Mux the H264 data into a mp4 Container.
And that is my Problem.
I readed the "umc-manual.pdf" an tried to adapt the sampel code so that it works for me.
The program runs nice and it writes a mp4 file to the Harddrive.
But i could not oben that mp4-file with any player.
I downloaded a programm called MediaInfo witch gives me follwing Information:
[bash]Allgemein
Format                           : MPEG-4
Format profile                   : Base Media / Version 1
Codec ID                         : mp41
File size                        : 129 MiB
Duration                         : 8s 300ms
Overall bit rate                 : 131 Mbps

Video
ID                               : 1
Codec ID                         : 0
Duration                         : 8s 300ms
Bit rate mode                    : konstant
Bit rate                         : 4 821 Kbps
Nominal bit rate                 : 705 Mbps
Width                            : 320 Pixel
Height                           : 220 Pixel
Display aspect ratio             : 3:2
Frame rate mode                  : konstant
Frame rate                       : 30,000 FPS
Bits/(Pixel*Frame)               : 2.283
Stream size                      : 4,79 MiB (4%)[/bash]
The video should have a playtime from 3min 36sek but the info says its only 8sek long.

So here is the code is use for creating the mp4 file:
Initialization:
[cpp]//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// Initialize Encoder 
	pEncoder = new UMC::H264VideoEncoder();
	pEncoderParams = new UMC::H264EncoderParams;

	pEncoderParams->info.clip_info.height    = height;  
	pEncoderParams->info.clip_info.width     = widht;    
	pEncoderParams->info.bitrate             = bitRate; 
	pEncoderParams->info.framerate			= frameRate;
	pEncoderParams->numFramesToEncode		= maxNumFrames;
	pEncoderParams->chroma_format_idc		= 0; //chroma_format_idc (0 - monochrom, 1 - 420, 2 - 422)
	pEncoderParams->info.color_format		= GRAY;
	pEncoderParams->numThreads               = 1;     

	if ((status = pEncoder->Init(pEncoderParams)) != UMC::UMC_OK) 
         return; 
	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// Initialize file writer
	pWriter = new UMC::FileWriter();
	UMC::FileWriterParams writerParams;
	vm_char dstFileName[MAX_FILELEN];
	vm_char *ext;
	vm_string_strcpy( dstFileName, srcFileName );
	ext = vm_string_strrchr( dstFileName, '.' );
	ext++;
	vm_string_strcpy( ext , "mp4" );

	writerParams.m_portion_size = 0;
	vm_string_strcpy(writerParams.m_file_name, 	dstFileName);
	if ((status = pWriter->Init(&writerParams)) != UMC::UMC_OK) 
         return; 

	//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// Initialize Muxer
	pMuxer = new UMC::MP4Muxer();
	UMC::MuxerParams        MuxerParams;      

	MuxerParams.m_lpDataWriter      = pWriter;    
	MuxerParams.m_SystemType        = UMC::MPEG4_SYSTEM_STREAM;    
	MuxerParams.m_lFlags            = UMC::FLAG_FRAGMENTED_AT_I_PICTURES; 
	MuxerParams.m_nNumberOfTracks   = 1;    
	MuxerParams.pTrackParams        = new UMC::TrackParams[MuxerParams.m_nNumberOfTracks]; 

	MuxerParams.pTrackParams[0].type = UMC::VIDEO_TRACK;    
	MuxerParams.pTrackParams[0].info.video = &pEncoderParams->info;    
	MuxerParams.pTrackParams[0].bufferParams.m_prefInputBufferSize=2000000;    
	MuxerParams.pTrackParams[0].bufferParams.m_prefOutputBufferSize=2000000;    

	if ((status = pMuxer->Init(&MuxerParams)) != UMC::UMC_OK)    
		return;   [/cpp]
Working Loop
[bash]UMC::VideoData in;
	UMC::VideoData *p_dataIn = ∈
	UMC::MediaData out(4*mWidth*mHeight);
	UMC::MediaData *p_dataOut = &out;
	UMC::Status    ret = UMC::UMC_OK;
	Ipp32s    len;

	p_dataIn->Init(mWidth, mHeight, mColorFormat, 8);
	p_dataIn->Alloc();

	mFramesEncoded = 0;

	do
	{
		if (mFramesEncoded >= mMaxNumFrames)
			p_dataIn = NULL; // get frames buffered inside encoder

		if (p_dataIn) 
		{
			if (UMC_OK == GetInputData(p_dataIn)) 
			{
				p_dataIn->SetTime((mFramesEncoded+1)/pEncoderParams->info.framerate);
			}
			else 
			{
				p_dataIn = NULL;
			}
		}
		//code video data 
		
		ret = pEncoder->GetFrame(p_dataIn, p_dataOut);

		if (ret != UMC_OK && ret != UMC_ERR_NOT_ENOUGH_DATA && ret != UMC_ERR_END_OF_STREAM) {
			vm_file_fprintf(vm_stderr, VM_STRING("Error: encoding failed at %d source frame (exit with %d)!\n"),
mFramesEncoded, ret); return UMC_ERR_FAILED; } len = (Ipp32s)p_dataOut->GetDataSize(); if (UMC::UMC_OK == ret) { ret = pMuxer->PutVideoData( p_dataOut ); if (UMC::UMC_OK == ret) { p_dataOut->SetDataSize(0); } } if ( p_dataIn ) { mFramesEncoded++; } else { if (!len || ret == UMC_ERR_END_OF_STREAM) break; // EOF } if (!(mFramesEncoded % 10)) { vm_string_printf(VM_STRING("%d."), mFramesEncoded); } }while (1); // EOS for video, inform muxer about it pMuxer->PutEndOfStream( pMuxer->GetTrackIndex( VIDEO_TRACK ) );[/bash]
So please can somebody help me?
Why is the mp4-file not playable?

greetings maxi
0 Kudos
6 Replies
Chao_Y_Intel
Moderator
411 Views


Maxi,

There is an update muxer sample code at this page. Could you check if this one can help?

http://software.intel.com/en-us/articles/getting-started-with-intel-ipp-unified-media-classes-sample/

Thanks,

Chao

0 Kudos
llt
Beginner
411 Views
Hi again,
the sampel helped me to create mpeg files but the mp4 muxing does not work properly.
I still have the problem that the .mp4 Video is only a few seconds long.

Is there any sampel for mp4 muxing?
Or can u give me some help in getting it work?

Maxi
0 Kudos
Chao_Y_Intel
Moderator
411 Views

Maxi,

My colleague provided me simple sample for MP4 muxer, attached. Can you check if it works?

Thanks,

Chao

0 Kudos
llt
Beginner
411 Views
Hi Chao Y thanks for the answer.

Tow more question:

Why does the muxer need information about the color format?

Line 46: VideoInfo.color_format=UMC::YV12;

And what color format do i need to feed to the Encoder?
I thought the encoder needs YUV420 and not YV12.


Maxi


Edit:
The h264 encoding and mp4 muxing works fine now.
I feeded the encoder with YUV420 data.
But i still want to know why the muxer needs color format infos.
0 Kudos
Sergey_O_Intel1
Employee
411 Views
Quoting llt
Why does the muxer need information about the color format?

The muxer dosn't use this info. You may check it yourself.
Color_format is used in encoders.

0 Kudos
Chao_Y_Intel
Moderator
411 Views

Hello,

> And what color format do i need to feed to the Encoder? I thought the encoder needs YUV420 and not YV12.

It depends on the raw video youre feeding into the encoder.You can check color format values in the corresponding enum (audio-video-codecs\core\umc\include\umc_structures.h):

.....

YV12 = 0, // Planar Y, V, U (4:2:0) (note V,U order!)

YUV420 , // Planar Y, U, V (4:2:0)
...


Thanks,
Chao

0 Kudos
Reply