-
- int init_decoder()
- {
- int ret;
- xvid_gbl_init_t xvid_gbl_init;
- xvid_dec_create_t xvid_dec_create;
-
- memset(&xvid_gbl_init, 0, sizeof(xvid_gbl_init_t));
- memset(&xvid_dec_create, 0, sizeof(xvid_dec_create_t));
-
-
-
- XDIM = 0 ;
- YDIM = 0 ;
- FORMAT = 0 ;
- CSP = XVID_CSP_BGR;
- BPP = 3;
-
- dec_handle = NULL ;
-
- mp4_buffer = NULL ;
- out_buffer = NULL ;
- mp4_ptr = NULL ;
-
- xvid_gbl_init.version = XVID_VERSION;
-
- xvid_gbl_init.cpu_flags = 0;
- xvid_gbl_init.debug = 0 ;
- xvid_global(NULL, 0, &xvid_gbl_init, NULL);
-
-
-
-
- xvid_dec_create.version = XVID_VERSION;
-
-
-
-
- xvid_dec_create.width = 0;
- xvid_dec_create.height = 0;
- ret = xvid_decore(NULL, XVID_DEC_CREATE, &xvid_dec_create, NULL);
- dec_handle = xvid_dec_create.handle;
- return(ret);
- }
-
- int decode_one_frame(unsigned char *istream, unsigned char *ostream,
- int istream_size, xvid_dec_stats_t *xvid_dec_stats)
- {
- int ret;
- xvid_dec_frame_t xvid_dec_frame;
-
- memset(&xvid_dec_frame, 0, sizeof(xvid_dec_frame_t));
- memset(xvid_dec_stats, 0, sizeof(xvid_dec_stats_t));
-
- xvid_dec_frame.version = XVID_VERSION;
- xvid_dec_stats->version = XVID_VERSION;
-
- xvid_dec_frame.general = 0;
-
- xvid_dec_frame.bitstream = istream;
- xvid_dec_frame.length = istream_size;
-
- xvid_dec_frame.output.plane[0] = ostream;
- xvid_dec_frame.output.stride[0] = XDIM*BPP;
- xvid_dec_frame.output.csp = CSP;
- ret = xvid_decore(dec_handle, XVID_DEC_DECODE
- , &xvid_dec_frame, xvid_dec_stats);
- return(ret);
- }
-
- do {
-
- used_bytes = decode_one_frame(mp4_ptr, out_buffer, useful_bytes, &xvid_dec_stats);
-
- if(xvid_dec_stats.type == XVID_TYPE_VOL)
- {
-
- if(XDIM*YDIM < xvid_dec_stats.data.vol.width*xvid_dec_stats.data.vol.height)
- {
-
- XDIM = xvid_dec_stats.data.vol.width;
- YDIM = xvid_dec_stats.data.vol.height;
-
-
- if(out_buffer) free(out_buffer);
-
- out_buffer = (unsigned char*)malloc(XDIM*YDIM*4);
- if(out_buffer == NULL)
- goto free_all_memory;
- }
- }
-
- if(used_bytes > 0) {
- mp4_ptr += used_bytes;
- useful_bytes -= used_bytes;
- }
- } while (xvid_dec_stats.type <= 0 && useful_bytes > MIN_USEFUL_BYTES);
-
- draw_image(out_buffer) ;
2 Xvid编解码 实践
关于编码器输入格式设置:
其中 en->width 图像采集时的宽度(以像素为单位)
- switch( input->format )
- {
- case FORMAT_RAW_BGR24:
- xvid_enc_frame.input.csp = XVID_CSP_BGR;
- xvid_enc_frame.input.stride[0] = en->width * 3;
- break;
- case FORMAT_RAW_UYVY:
- xvid_enc_frame.input.csp = XVID_CSP_UYVY;
- xvid_enc_frame.input.stride[0] = en->width * 2;
- break;
- case FORMAT_RAW_YUY2:
- xvid_enc_frame.input.csp = XVID_CSP_YUY2;
- xvid_enc_frame.input.stride[0] = en->width * 2;
- break;
- }
解码器输出格式设置:
- switch( output->format )
- {
- case FORMAT_RAW_BGR24:
- xvid_dec_frame.output.stride[0] = m_width*3;
- xvid_dec_frame.output.csp =XVID_CSP_BGR;
-
- break;
- case FORMAT_RAW_YUY2:
- xvid_dec_frame.output.csp = XVID_CSP_YUY2;
- xvid_dec_frame.output.stride[0]= en->width * 2;
- break;
- }
特别注意的是:
在xvid 中stride 步长与 视频格式有密切格式 一旦设置错误导致 编解码异常终止。
xvid使用小技巧:
(1)解决:使用xvid编解码rtp传输directshow 播放远程视频时开始会出现绿屏但可以看到图像轮廓,在经过几秒后正常
很可能的一个原因是 关键帧丢失 方法:
减小关键帧的间隔
-
- xvid_enc_create.max_key_interval = 1;
(2)(获得编码后 帧长度)
- ret = xvid_encore(m_enc_handle, XVID_ENC_ENCODE, &xvid_enc_frame,&xvid_enc_stats);
- m_enc_frame_length=xvid_enc_stats.length;
(markman101) |