📄 dirac.c
字号:
{ /* Initialize video output */ uint8_t *buf[3]; msg_Dbg( p_dec, "%dx%d, chroma %i, %f fps", p_sys->p_dirac->seq_params.width, p_sys->p_dirac->seq_params.height, p_sys->p_dirac->seq_params.chroma, (float)p_sys->p_dirac->seq_params.frame_rate.numerator/ p_sys->p_dirac->seq_params.frame_rate.denominator ); FreeFrameBuffer( p_sys->p_dirac ); buf[0] = malloc( p_sys->p_dirac->seq_params.width * p_sys->p_dirac->seq_params.height ); buf[1] = malloc( p_sys->p_dirac->seq_params.chroma_width * p_sys->p_dirac->seq_params.chroma_height ); buf[2] = malloc( p_sys->p_dirac->seq_params.chroma_width * p_sys->p_dirac->seq_params.chroma_height ); dirac_set_buf( p_sys->p_dirac, buf, NULL ); break; } case STATE_SEQUENCE_END: msg_Dbg( p_dec, "SEQUENCE_END" ); FreeFrameBuffer( p_sys->p_dirac ); break; case STATE_PICTURE_START: msg_Dbg( p_dec, "PICTURE_START: frame_type=%i frame_num=%d", p_sys->p_dirac->frame_params.ftype, p_sys->p_dirac->frame_params.fnum ); break; case STATE_PICTURE_AVAIL: msg_Dbg( p_dec, "PICTURE_AVAI : frame_type=%i frame_num=%d", p_sys->p_dirac->frame_params.ftype, p_sys->p_dirac->frame_params.fnum ); /* Picture available for display */ p_pic = GetNewPicture( p_dec ); p_pic->date = p_block->i_pts > 0 ? p_block->i_pts : p_block->i_dts; p_pic->b_force = 1; // HACK return p_pic; break; case STATE_INVALID: msg_Dbg( p_dec, "STATE_INVALID" ); break; default: break; } } /* Never reached */ return NULL;}/***************************************************************************** * encoder_sys_t : dirac encoder descriptor *****************************************************************************/#define ENC_BUFSIZE 1024*1024struct encoder_sys_t{ /* * Dirac properties */ dirac_encoder_t *p_dirac; dirac_encoder_context_t ctx; uint8_t *p_buffer_in; int i_buffer_in; uint8_t p_buffer_out[ENC_BUFSIZE];};/***************************************************************************** * OpenEncoder: probe the encoder and return score *****************************************************************************/static int OpenEncoder( vlc_object_t *p_this ){ encoder_t *p_enc = (encoder_t *)p_this; encoder_sys_t *p_sys = p_enc->p_sys; vlc_value_t val; float f_quality; if( p_enc->fmt_out.i_codec != VLC_FOURCC('d','r','a','c') && !p_enc->b_force ) { return VLC_EGENERIC; } /* Allocate the memory needed to store the decoder's structure */ if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL ) { msg_Err( p_enc, "out of memory" ); return VLC_EGENERIC; } memset( p_sys, 0, sizeof(encoder_sys_t) ); p_enc->p_sys = p_sys; p_enc->pf_encode_video = Encode; p_enc->fmt_in.i_codec = VLC_FOURCC('I','4','2','0'); p_enc->fmt_in.video.i_bits_per_pixel = 12; p_enc->fmt_out.i_codec = VLC_FOURCC('d','r','a','c'); sout_CfgParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg ); /* Initialse the encoder context with the presets for SD576 - Standard * Definition Digital (some parameters will be overwritten later on) */ dirac_encoder_context_init( &p_sys->ctx, SD576 ); /* Override parameters if required */ p_sys->ctx.seq_params.width = p_enc->fmt_in.video.i_width; p_sys->ctx.seq_params.height = p_enc->fmt_in.video.i_height; p_sys->ctx.seq_params.chroma = format420; p_sys->ctx.seq_params.frame_rate.numerator = p_enc->fmt_in.video.i_frame_rate; p_sys->ctx.seq_params.frame_rate.denominator = p_enc->fmt_in.video.i_frame_rate_base; p_sys->ctx.seq_params.interlace = 0; p_sys->ctx.seq_params.topfieldfirst = 0; var_Get( p_enc, ENC_CFG_PREFIX "quality", &val ); f_quality = val.f_float; if( f_quality > 10 ) f_quality = 10; if( f_quality < 1 ) f_quality = 1; p_sys->ctx.enc_params.qf = f_quality; /* Initialise the encoder with the encoder context */ p_sys->p_dirac = dirac_encoder_init( &p_sys->ctx, 0 ); /* Set the buffer size for the encoded picture */ p_sys->i_buffer_in = p_enc->fmt_in.video.i_width * p_enc->fmt_in.video.i_height * 3 / 2; p_sys->p_buffer_in = malloc( p_sys->i_buffer_in ); return VLC_SUCCESS;}/**************************************************************************** * Encode: the whole thing **************************************************************************** * This function spits out ogg packets. ****************************************************************************/static block_t *Encode( encoder_t *p_enc, picture_t *p_pic ){ encoder_sys_t *p_sys = p_enc->p_sys; block_t *p_block, *p_chain = NULL; int i_plane, i_line, i_width, i_src_stride; uint8_t *p_dst; /* Copy input picture in encoder input buffer (stride by stride) */ p_dst = p_sys->p_buffer_in; for( i_plane = 0; i_plane < p_pic->i_planes; i_plane++ ) { uint8_t *p_src = p_pic->p[i_plane].p_pixels; i_width = p_pic->p[i_plane].i_visible_pitch; i_src_stride = p_pic->p[i_plane].i_pitch; for( i_line = 0; i_line < p_pic->p[i_plane].i_visible_lines; i_line++ ) { p_enc->p_vlc->pf_memcpy( p_dst, p_src, i_width ); p_dst += i_width; p_src += i_src_stride; } } /* Load one frame of data into encoder */ if( dirac_encoder_load( p_sys->p_dirac, p_sys->p_buffer_in, p_sys->i_buffer_in ) >= 0 ) { dirac_encoder_state_t state; msg_Dbg( p_enc, "dirac_encoder_load" ); /* Retrieve encoded frames from encoder */ do { p_sys->p_dirac->enc_buf.buffer = p_sys->p_buffer_out; p_sys->p_dirac->enc_buf.size = ENC_BUFSIZE; state = dirac_encoder_output( p_sys->p_dirac ); msg_Dbg( p_enc, "dirac_encoder_output: %i", state ); switch( state ) { case ENC_STATE_AVAIL: // Encoded frame available in encoder->enc_buf // Encoded frame params available in enccoder->enc_fparams // Encoded frame stats available in enccoder->enc_fstats p_block = block_New( p_enc, p_sys->p_dirac->enc_buf.size ); memcpy( p_block->p_buffer, p_sys->p_dirac->enc_buf.buffer, p_sys->p_dirac->enc_buf.size ); p_block->i_dts = p_block->i_pts = p_pic->date; block_ChainAppend( &p_chain, p_block ); break; case ENC_STATE_BUFFER: break; case ENC_STATE_INVALID: default: break; } if( p_sys->p_dirac->decoded_frame_avail ) { //locally decoded frame is available in //encoder->dec_buf //locally decoded frame parameters available //in encoder->dec_fparams } if( p_sys->p_dirac->instr_data_avail ) { //Instrumentation data (motion vectors etc.) //available in encoder->instr } } while( state == ENC_STATE_AVAIL ); } else { msg_Dbg( p_enc, "dirac_encoder_load() error" ); } return p_chain;}/***************************************************************************** * CloseEncoder: dirac encoder destruction *****************************************************************************/static void CloseEncoder( vlc_object_t *p_this ){ encoder_t *p_enc = (encoder_t *)p_this; encoder_sys_t *p_sys = p_enc->p_sys; msg_Dbg( p_enc, "resulting bit-rate: %i bits/sec", p_sys->p_dirac->enc_seqstats.bit_rate ); /* Free the encoder resources */ dirac_encoder_close( p_sys->p_dirac ); free( p_sys->p_buffer_in ); free( p_sys );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -