⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dirac.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 2 页
字号:
        {            /* 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 + -