/*************Encoding Parameters*********************/ H264EncoderParams *p_vidEncoderParams = NULL; p_vidEncoderParams = new H264EncoderParams; p_vidEncoderParams->key_frame_controls.method = 1; p_vidEncoderParams->key_frame_controls.interval = 100; p_vidEncoderParams->B_Frame_Rate = 1; p_vidEncoderParams->src_width = IMAGE_WIDTH; p_vidEncoderParams->src_height = IMAGE_HEIGHT; p_vidEncoderParams->dst_width = IMAGE_WIDTH; p_vidEncoderParams->dst_height = IMAGE_HEIGHT; p_vidEncoderParams->frame_rate_code = 5; p_vidEncoderParams->key_frame_controls.method = p_vidEncoderParams->rate_controls.method = H264_RCM_MPEG2; // RC method(0 - quant_codes, 1 - CBR MBwise, 2 - CBR framewise, 3 - Debug); p_vidEncoderParams->rate_controls.bitrate = 100000;//_info.bitrate; p_vidEncoderParams->key_frame_controls.rate_controls.bitrate = p_vidEncoderParams->B_frame_rate_controls.bitrate = p_vidEncoderParams->rate_controls.bitrate; p_vidEncoderParams->rate_controls.quant = 26; p_vidEncoderParams->B_frame_rate_controls.quant = p_vidEncoderParams->rate_controls.quant; p_vidEncoderParams->key_frame_controls.rate_controls.quant = 10; p_vidEncoderParams->key_frame_controls.interval = p_vidEncoderParams->key_frame_controls.idr_interval = 3 * 10; //N (# of frames in between I frames), //IDR interval. Last two parameters must be equal. p_vidEncoderParams->B_frame_rate_controls.method = p_vidEncoderParams->rate_controls.method; p_vidEncoderParams->B_Frame_Rate = 0; //Number of B frames between I (or P) and next P p_vidEncoderParams->treat_B_as_reference = 0; // treat B as a reference (only 0 is supported!) p_vidEncoderParams->num_ref_frames = 2; // num_ref_frames (2-16), p_vidEncoderParams->num_ref_to_start_code_B_slice = 1; //minimum length of list1 for backward prediction (only 1 is supported!). p_vidEncoderParams->level_idc = 40; // level_idc (check that num_ref_frames and frame size are in accordance with the level) p_vidEncoderParams->me_split_8x8s = 0; // subblock split p_vidEncoderParams->me_search_x = p_vidEncoderParams->me_search_y = 4; // search x,search_y p_vidEncoderParams->use_weighted_pred = p_vidEncoderParams->use_weighted_bipred = p_vidEncoderParams->use_implicit_weighted_bipred = 0; // weighted prediction, weighted biprediction implicit weighted biprediction (not supported!) p_vidEncoderParams->use_spatial_direct_pred = 0; // direct type (0 - temporal 1 - spatial) p_vidEncoderParams->use_direct_inference = 0; // direct_inference_flag p_vidEncoderParams->entropy_coding_mode = 1; p_vidEncoderParams->Deblocking_Filter_Mode = 1; // deblocking mode (0 - "on", 1 - "off") p_vidEncoderParams->Deblocking_Filter_Alpha = 0; // deblocking_filter_alpha [-6,6] p_vidEncoderParams->Deblocking_Filter_Beta = 0; // deblocking_filter_beta [-6,6] p_vidEncoderParams->entropy_coding_mode = 1; // entropy coding mode (0-cavlc,1-cabac) p_vidEncoderParams->cabac_init_idc = 0; // cabac_init_idc (0,1,2) p_vidEncoderParams->coding_type = 0; // picture coding type (0 - only FRM, 1 - only FLD , 2 - only AFRM, 3 - pure PicAFF(no MBAFF) 4 PicAFF + MBAFF). Only 0 (FRM) is supported! p_vidEncoderParams->numThreads = 1; p_vidEncoderParams->FrameRate = 3; /***************End of Encoding Parameters***********************/ /***************Decoding Parameters******************************/ VideoDecoderParams *pParams; pParams = new VideoDecoderParams; ColorSpaceConverter *ColorDecoder; ColorDecoder = new ColorSpaceConverter; VideoStreamInfo video_info; video_info.color_format = UMC::YUV420; video_info.stream_type = UMC::H264_VIDEO; video_info.stream_subtype = UMC::UNDEF_VIDEO_SUBTYPE; video_info.clip_info.width = IMAGE_WIDTH; video_info.clip_info.height = IMAGE_HEIGHT; UMC::ColorConversionInfo ColorInit; ColorInit.SizeSource.width = video_info.clip_info.width; ColorInit.SizeSource.height = video_info.clip_info.height; vm_var32 uiFactor = 1; ColorInit.FormatDest = UMC::YUV420; ColorInit.SizeDest.width = video_info.clip_info.width; ColorInit.SizeDest.height = video_info.clip_info.height; ColorInit.lFlags = 1; ColorInit.lDeinterlace = 0; ColorInit.lInterpolation = UMC::FLAG_CCNV_NONE; pParams->info = video_info; pParams->cformat = UMC::YUV420; pParams->lFlags = 0; pParams->lpConverter = ColorDecoder; pParams->lpConvertInit = &ColorInit; pParams->uiLimitThreads = 1; /**************End of Decoding Parameters************************/ /********Init Encoder***********/ p_vidEncoder = createH264VideoEncoder(); if (p_vidEncoder->Init(p_vidEncoderParams) != UMC_OK) { MessageBox("Error: Video encoder initialization failed", 0, MB_OK); return FALSE; } /********Init Decoder***********/ p_vidDecoder = new H264VideoDecoder; p_vidDecoder->Init(pParams); /**************Encoding******************/ Status convert; Status encode; Ipp8u *pBS = NULL; Ipp8u *pYuvDst[3]; VideoData *p_dataInLocal = NULL; MediaData *p_dataOutLocal = NULL; IppiSize roiSize = { IMAGE_WIDTH, IMAGE_HEIGHT}; int mSizeLocal = (IMAGE_HEIGHT*IMAGE_WIDTH + (IMAGE_HEIGHT/2)*(IMAGE_WIDTH/2) + (IMAGE_HEIGHT/2)*(IMAGE_WIDTH/2)); int size = (IMAGE_HEIGHT*IMAGE_WIDTH); pBS = new Ipp8u[2*size]; p_dataInLocal = new VideoData; p_dataOutLocal = new MediaData; pYuvDst[0] = (Ipp8u*)malloc(roiSize.height * roiSize.width * sizeof(Ipp8u)); pYuvDst[1] = (Ipp8u*)malloc(roiSize.height * roiSize.width * sizeof(Ipp8u)); //sizeof(Ipp8u)/4 pYuvDst[2] = (Ipp8u*)malloc(roiSize.height * roiSize.width * sizeof(Ipp8u)); //sizeof(Ipp8u)/4 p_dataInLocal->SetDest(pYuvDst[0], pYuvDst[1], pYuvDst[2]); p_dataInLocal->SetColorFormat(YUV420); p_dataInLocal->SetPitch(IMAGE_WIDTH, IMAGE_WIDTH/2, IMAGE_WIDTH/2); p_dataInLocal->SetDataSize(mSizeLocal); p_dataInLocal->SetVideoParameters(IMAGE_WIDTH, IMAGE_HEIGHT, YUV420); p_dataOutLocal->SetBufferPointer(pBS, 2*size); p_dataOutLocal->SetDataSize(2*size); convert = ippiRGBToYUV420_8u_C3P3(data, pYuvDst, roiSize); //data here is got from the camera encode = p_vidEncoder->GetFrame(p_dataInLocal, p_dataOutLocal); /***********Decoding***************************/ Status umcRes; Ipp8u *pY = NULL, *pU = NULL, *pV = NULL; MediaData p_dataInRemote; VideoData p_dataInRemote; int mSizeRemote = IMAGE_WIDTH * IMAGE_HEIGHT; pY = pU = pV = pBS = NULL; pY = new Ipp8u[mSizeRemote]; pU = new Ipp8u[mSizeRemote]; pV = new Ipp8u[mSizeRemote]; pBS = new Ipp8u[2*mSizeRemote]; out.SetDest(pY,pU,pV); out.SetPitch(IMAGE_WIDTH, IMAGE_WIDTH/2, IMAGE_WIDTH/2); out.SetColorFormat(YUV420); out.SetDataSize(IMAGE_HEIGHT*IMAGE_WIDTH + (IMAGE_HEIGHT/2)*(IMAGE_WIDTH/2) + (IMAGE_HEIGHT/2)*(IMAGE_WIDTH/2)); in.SetBufferPointer(pBS, 2*size); //pBS is the compressed output from the encoder above in.SetDataSize(2*size); umcRes = p_vidDecoder->GetFrame(&in, &out);