4-28 x264_reference_update


1.

X264_Reference_update和x264_reference_build_list( h, h->fdec->i_poc );之前

printf("[%d][%d][%d][%d]=======",h->i_frame,h->fenc->i_frame,h->fdec->i_frame,h->fenc->i_type );

没有b帧的情况下,h->i_frame和h->fenc->i_frame同步,h->fenc->i_frame比h->fdec->i_frame

大一,也就是每编一帧重建之后赋值给fdec作为重建帧,来后续使用。此过程发生在38帧之前。

当有b帧的时候,排序过程就不是这样了。而且在这里类型已经决定了

2.在x264_reference_update()函数中 第一个判定条件

static inline int x264_reference_update( x264_t *h )

{

static updata_counter = 1;

if( !h->fdec->b_kept_as_ref )

{

if( h->i_thread_frames > 1 )

{

x264_frame_push_unused( h, h->fdec );

printf("[%d][%d][%d]\n",h->i_frame,h->fdec->i_frame,h->fdec->b_fdec);

h->fdec = x264_frame_pop_unused( h, 1 );

if( !h->fdec )

return -1;

}

return 0;

}

在我想来这里应该对于每一个帧都是成立的,但是打印出来信息不是这样的,第一帧成立然后开始序列为 41 39 1==43 41 1==这样的,这个是专门b帧的,最后又打印出来每一个类型信息f->fdec->i_type 每一个都是5.这个判定条件的意义不是很明确。

有点迷惑unused[1]中进行的push和pop操作,但是都是先进先出的,这里等于是对每一个操作做了个出入操作。。。。没看懂

网上有一个整体解释,看明白了,但是仍然有点不太明白作用。再次分析

static inline int x264_reference_update( x264_t *h )

{

static updata_counter = 1;

if( !h->fdec->b_kept_as_ref )

{

if( h->i_thread_frames > 1 )

{

x264_frame_push_unused( h, h->fdec );

printf("[%d][%d][%d]\n",h->i_frame,h->fdec->i_frame,h->fdec->b_fdec);

h->fdec = x264_frame_pop_unused( h, 1 );

if( !h->fdec )

return -1;

}

return 0;

}

首先进来的都是b帧,确定里面参考帧数为1的放入unused[1]重建帧队列中,然后再从unused[1]参考帧队列中弹出来一帧。在刚才x264_frame_push_unused()中有一个判断条件

Frame->i_reference_count>0参考帧数要大于不为0,frame->i_refrence_count—之后判断其是否为0,就是为了断定是否frame->i_reference_count是否为1.

3.然后的步骤就是讲f->fdec放入reference中,这里就解释了到b帧的时候fdec->i_frame

和h->fenc->i_frame在也不保持一直的原因。上面那个过程等于是做了个缓存,明白操作,但是具体为什么这么做要在后来联系起来解释。

x264_frame_push( h->frames.reference, h->fdec );

if( h->frames.reference[h->sps->i_num_ref_frames] )

x264_frame_push_unused( h, x264_frame_shift( h->frames.reference ) );

h->fdec = x264_frame_pop_unused( h, 1 );

if( !h->fdec )

return -1;

return 0;

4,。中间缺少一个东西完全找不到信息的东西

/* apply mmco from previous frame. */

for( int i = 0; i < h->sh.i_mmco_command_count; i++ )

for( int j = 0; h->frames.reference[j]; j++ )

if( h->frames.reference[j]->i_poc == h->sh.mmco[i].i_poc )

x264_frame_push_unused( h, x264_frame_shift( &h->frames.reference[j] ) );

这个过程,完全找不到中文资料。等下再解决

优质内容筛选与推荐>>
1、明基CD-R真假鉴别方法
2、【K】【POJ 1887】【POJ 2533】
3、(转)很简短,但读完你会感触良多!
4、node.js 学习笔记一:创建一个服务器
5、angualrJS中的坑


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号