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

📄 xxmc.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
                /* Set the first 2 reference frames */                mpeg2_set_buf( p_sys->p_mpeg2dec, buf, NULL );                if( (p_pic = GetNewPicture( p_dec, buf )) == NULL )                {                    block_Release( p_block );                    return NULL;                }                mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic );                p_pic->date = 0;                p_dec->pf_picture_link( p_dec, p_pic );                if( p_sys->p_synchro )                {                    decoder_SynchroRelease( p_sys->p_synchro );                }                p_sys->p_synchro = decoder_SynchroInit( p_dec,                    (uint32_t)((uint64_t)1001000000 * 27 /                    p_sys->p_info->sequence->frame_period) );                p_sys->b_after_sequence_header = 1;            }            break;            case STATE_PICTURE_2ND:                decoder_SynchroNewPicture( p_sys->p_synchro,                        p_sys->p_info->current_picture->flags & PIC_MASK_CODING_TYPE,                        p_sys->p_info->current_picture->nb_fields,                        0, 0, p_sys->i_current_rate,                        p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY );                if( p_sys->b_skip )                {                    decoder_SynchroTrash( p_sys->p_synchro );                }                else                {                    decoder_SynchroDecode( p_sys->p_synchro );                }                break;            case STATE_PICTURE:            {                uint8_t *buf[3];                mtime_t i_pts;                buf[0] = buf[1] = buf[2] = NULL;                if ( p_sys->b_after_sequence_header &&                    ((p_sys->p_info->current_picture->flags &                        PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_P) )                {                    /* Intra-slice refresh. Simulate a blank I picture. */                    msg_Dbg( p_dec, "intra-slice refresh stream" );                    decoder_SynchroNewPicture( p_sys->p_synchro,                        I_CODING_TYPE, 2, 0, 0, p_sys->i_current_rate,                        p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY );                    decoder_SynchroDecode( p_sys->p_synchro );                    decoder_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 );                    p_sys->b_slice_i = 1;                }                p_sys->b_after_sequence_header = 0;#ifdef PIC_FLAG_PTS                i_pts = p_sys->p_info->current_picture->flags & PIC_FLAG_PTS ?                    ( ( p_sys->p_info->current_picture->pts ==                        (uint32_t)p_sys->i_current_pts ) ?                    p_sys->i_current_pts : p_sys->i_previous_pts ) : 0;#else /* New interface */                i_pts = p_sys->p_info->current_picture->flags & PIC_FLAG_TAGS ?                    ( ( p_sys->p_info->current_picture->tag ==                        (uint32_t)p_sys->i_current_pts ) ?                    p_sys->i_current_pts : p_sys->i_previous_pts ) : 0;#endif                /* Hack to handle demuxers which only have DTS timestamps */                if( !i_pts && !p_block->i_pts && p_block->i_dts > 0 )                {                    if( p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY ||                        (p_sys->p_info->current_picture->flags &                        PIC_MASK_CODING_TYPE) == PIC_FLAG_CODING_TYPE_B )                    {                        i_pts = p_block->i_dts;                    }                }                p_block->i_pts = p_block->i_dts = 0;                /* End hack */                decoder_SynchroNewPicture( p_sys->p_synchro,                    p_sys->p_info->current_picture->flags & PIC_MASK_CODING_TYPE,                    p_sys->p_info->current_picture->nb_fields, i_pts,                    0, p_sys->i_current_rate,                    p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY );                if ( !(p_sys->b_slice_i                    && ((p_sys->p_info->current_picture->flags                            & PIC_MASK_CODING_TYPE) == P_CODING_TYPE))                    && !decoder_SynchroChoose( p_sys->p_synchro,                                p_sys->p_info->current_picture->flags                                    & PIC_MASK_CODING_TYPE,                                /*FindVout(p_dec)->render_time*/ 0 /*FIXME*/,                                p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY ) )                {                    mpeg2_skip( p_sys->p_mpeg2dec, 1 );                    p_sys->b_skip = 1;                    decoder_SynchroTrash( p_sys->p_synchro );                    mpeg2_set_buf( p_sys->p_mpeg2dec, buf, NULL );                }                else                {                    mpeg2_skip( p_sys->p_mpeg2dec, 0 );                    p_sys->b_skip = 0;                    decoder_SynchroDecode( p_sys->p_synchro );                    if( (p_pic = GetNewPicture( p_dec, buf )) == NULL )                    {                        block_Release( p_block );                        return NULL;                    }                    p_sys->p_mpeg2dec->ptr_forward_ref_picture = p_sys->p_mpeg2dec->fbuf[2]->id;                    p_sys->p_mpeg2dec->ptr_backward_ref_picture = p_sys->p_mpeg2dec->fbuf[1]->id;                    if ((p_sys->p_info->current_picture->flags & PIC_MASK_CODING_TYPE) != B_CODING_TYPE)                    {                        //if (p_sys->p_mpeg2dec->ptr_forward_ref_picture &&                        //    p_sys->p_mpeg2dec->ptr_forward_ref_picture != picture->backward_reference_frame)                        //    p_pic->forward_reference_frame->free (p_pic->forward_reference_frame);                        p_sys->p_mpeg2dec->ptr_forward_ref_picture =                                    p_sys->p_mpeg2dec->ptr_backward_ref_picture;                        p_sys->p_mpeg2dec->ptr_backward_ref_picture = (void *)p_pic;                    }                    mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic );                }            }            break;            case STATE_END:            case STATE_SLICE:                p_pic = NULL;                if( p_sys->p_info->display_fbuf                    && p_sys->p_info->display_fbuf->id )                {                    p_pic = (picture_t *)p_sys->p_info->display_fbuf->id;                    decoder_SynchroEnd( p_sys->p_synchro,                                p_sys->p_info->display_picture->flags                                & PIC_MASK_CODING_TYPE,                                p_sys->b_garbage_pic );                    p_sys->b_garbage_pic = 0;                    if ( p_sys->p_picture_to_destroy != p_pic )                    {                        p_pic->date = decoder_SynchroDate( p_sys->p_synchro );                    }                    else                    {                        p_sys->p_picture_to_destroy = NULL;                        p_pic->date = 0;                    }                }                if( p_sys->p_info->discard_fbuf &&                    p_sys->p_info->discard_fbuf->id )                {                    p_dec->pf_picture_unlink( p_dec, p_sys->p_info->discard_fbuf->id );                }                /* For still frames */                //if( state == STATE_END && p_pic ) p_pic->b_force = true;                if( p_pic )                {#if 0                    /* Avoid frames with identical timestamps.                     * Especially needed for still frames in DVD menus. */                     if( p_sys->i_last_frame_pts == p_pic->date ) p_pic->date++;                        p_sys->i_last_frame_pts = p_pic->date;#endif                    return p_pic;                }                break;            case STATE_INVALID:            {                uint8_t *buf[3];                buf[0] = buf[1] = buf[2] = NULL;                msg_Warn( p_dec, "invalid picture encountered" );                if ( ( p_sys->p_info->current_picture == NULL ) ||                ( ( p_sys->p_info->current_picture->flags &                    PIC_MASK_CODING_TYPE) != B_CODING_TYPE ) )                {                    if( p_sys->p_synchro ) decoder_SynchroReset( p_sys->p_synchro );                }                mpeg2_skip( p_sys->p_mpeg2dec, 1 );                p_sys->b_skip = 1;                if( p_sys->p_info->current_fbuf &&                    p_sys->p_info->current_fbuf->id )                {                    p_sys->b_garbage_pic = 1;                    p_pic = p_sys->p_info->current_fbuf->id;                }                else if( !p_sys->p_info->sequence )                {                    break;                }                else                {                    if( (p_pic = GetNewPicture( p_dec, buf )) == NULL )                        break;                    mpeg2_set_buf( p_sys->p_mpeg2dec, buf, p_pic );                }                p_sys->p_picture_to_destroy = p_pic;                memset( p_pic->p[0].p_pixels, 0,                        p_sys->p_info->sequence->width                        * p_sys->p_info->sequence->height );                memset( p_pic->p[1].p_pixels, 0x80,                        p_sys->p_info->sequence->width                        * p_sys->p_info->sequence->height / 4 );                memset( p_pic->p[2].p_pixels, 0x80,                        p_sys->p_info->sequence->width                        * p_sys->p_info->sequence->height / 4 );                if( p_sys->b_slice_i )                {                    decoder_SynchroNewPicture( p_sys->p_synchro,                        I_CODING_TYPE, 2, 0, 0, p_sys->i_current_rate,                        p_sys->p_info->sequence->flags & SEQ_FLAG_LOW_DELAY );                    decoder_SynchroDecode( p_sys->p_synchro );                    decoder_SynchroEnd( p_sys->p_synchro, I_CODING_TYPE, 0 );                }                break;            }            default:                break;        }    }    return NULL;}/***************************************************************************** * CloseDecoder: libmpeg2 decoder destruction *****************************************************************************/static void CloseDecoder( vlc_object_t *p_this ){    decoder_t *p_dec = (decoder_t *)p_this;    decoder_sys_t *p_sys = p_dec->p_sys;    FILE *f_wd_dec;    if( p_sys->p_synchro ) decoder_SynchroRelease( p_sys->p_synchro );    if( p_sys->p_mpeg2dec ) mpeg2_close( p_sys->p_mpeg2dec );    f_wd_dec = fopen("/vlc/dec_pid", "w");    if (f_wd_dec != NULL)    {        fprintf(f_wd_dec, "0\n");        fflush(f_wd_dec);        fclose(f_wd_dec);    }    free( p_sys );}static double get_aspect_ratio( decoder_t *p_dec ){    decoder_sys_t *p_sys = p_dec->p_sys;    double ratio;    double mpeg1_pel_ratio[16] = {1.0 /* forbidden */,        1.0, 0.6735, 0.7031, 0.7615, 0.8055, 0.8437, 0.8935, 0.9157,        0.9815, 1.0255, 1.0695, 1.0950, 1.1575, 1.2015, 1.0 /*reserved*/ };    if( !p_sys->p_mpeg2dec->decoder.mpeg1 )    {        /* these hardcoded values are defined on mpeg2 standard for        * aspect ratio. other values are reserved or forbidden.  */        switch( p_sys->p_mpeg2dec->decoder.aspect_ratio_information )        {            case 2:                ratio = 4.0/3.0;                break;            case 3:                ratio = 16.0/9.0;                break;            case 4:                ratio = 2.11/1.0;                break;            case 1:                default:                ratio = (double)p_sys->p_mpeg2dec->decoder.width/(double)p_sys->p_mpeg2dec->decoder.height;            break;        }    }    else    {        /* mpeg1 constants refer to pixel aspect ratio */        ratio = (double)p_sys->p_mpeg2dec->decoder.width/(double)p_sys->p_mpeg2dec->decoder.height;        ratio /= mpeg1_pel_ratio[p_sys->p_mpeg2dec->decoder.aspect_ratio_information];    }    return ratio;}/***************************************************************************** * GetNewPicture: Get a new picture from the vout and set the buf struct *****************************************************************************/static picture_t *GetNewPicture( decoder_t *p_dec, uint8_t **pp_buf ){    //msg_Dbg(p_dec, "GetNewPicture Entering");    decoder_sys_t *p_sys = p_dec->p_sys;    picture_t *p_pic;    p_dec->fmt_out.video.i_width = p_sys->p_info->sequence->width;    p_dec->fmt_out.video.i_height = p_sys->p_info->sequence->height;    p_dec->fmt_out.video.i_aspect = p_sys->i_aspect;    if( p_sys->p_info->sequence->frame_period > 0 )    {        p_dec->fmt_out.video.i_frame_rate =            (uint32_t)( (uint64_t)1001000000 * 27 /                        p_sys->p_info->sequence->frame_period );        p_dec->fmt_out.video.i_frame_rate_base = 1001;    }    p_dec->fmt_out.i_codec =        ( p_sys->p_info->sequence->chroma_height <          p_sys->p_info->sequence->height ) ?        VLC_FOURCC('I','4','2','0') : VLC_FOURCC('I','4','2','2');#if 0    p_sys->f_wd_nb = fopen("/vlc/dec_nb", "w");    if (p_sys->f_wd_nb != NULL)    {//      fprintf(p_sys->f_wd_nb, "%d\n", mdate());        fprintf(p_sys->f_wd_nb, "%s\n", mdate());        fflush(p_sys->f_wd_nb);    }#endif    p_pic = p_dec->pf_vout_buffer_new( p_dec );    if( p_pic == NULL ) return NULL;    p_pic->b_progressive = p_sys->p_info->current_picture != NULL ?        p_sys->p_info->current_picture->flags & PIC_FLAG_PROGRESSIVE_FRAME : 1;    p_pic->b_top_field_first = p_sys->p_info->current_picture != NULL ?        p_sys->p_info->current_picture->flags & PIC_FLAG_TOP_FIELD_FIRST : 1;    p_pic->i_nb_fields = p_sys->p_info->current_picture != NULL ?        p_sys->p_info->current_picture->nb_fields : 2;    p_pic->format.i_frame_rate = p_dec->fmt_out.video.i_frame_rate;    p_pic->format.i_frame_rate_base = p_dec->fmt_out.video.i_frame_rate_base;    p_dec->pf_picture_link( p_dec, p_pic );    pp_buf[0] = p_pic->p[0].p_pixels;    pp_buf[1] = p_pic->p[1].p_pixels;    pp_buf[2] = p_pic->p[2].p_pixels;    /* let driver ensure this image has the right format */#if 0    this->driver->update_frame_format( p_pic->p_sys->p_vout, p_pic,                                       p_dec->fmt_out.video.i_width,                                       p_dec->fmt_out.video.i_height,                                       p_dec->fmt_out.video.i_aspect,                                       format, flags);#endif    mpeg2_xxmc_choose_coding( p_dec, &p_sys->p_mpeg2dec->decoder, p_pic,                              get_aspect_ratio(p_dec), 0 );    return p_pic;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -