I帧和IDR帧区别

转载 2013年12月04日 09:38:33

帧和 IDR 帧的区别:

    IDR 帧属于 帧。解码器收到 IDR frame  时,将所有的参考帧队列丢弃 (用x264_reference_reset 函数实现——在 encoder.c 文件中) 。这点是所有 帧共有的特性,但是收到 IDR 帧时,解码器另外需要做的工作就是:把所有的 PPS 和 SPS 参数进行更新。由此可见,在编码器端,每发一个 IDR ,就相应地发一个  PPS&SPS_nal_unit

     这是网上搜索到的一个答案,有一定参考价值吧。

先说明:所有的 IDR 帧都是 帧,但是并不是所有 帧都是 IDR 帧。就是说, IDR 帧是 帧的子集。 (我们程序中设定的是每250帧出现一个 IDR 帧)

我们用的程序是这样的:

      /* ------------------- Setup frame context ----------------------------- */

     /* 5: Init da ta dependant of frame type */

     if ( h->fenc->i_type ==  X264_TYPE_IDR  )

     {

          /* reset ref pictures */

           x264_reference_reset ( h );

         i_nal_type      =  NAL_SLICE_IDR ;

         i_nal_ref_idc = NAL_PRIORITY_ HIGHEST ;

         i_slice_type = SLICE_TYPE_ ;

     }

      else if ( h->fenc->i_type ==  X264_TYPE_I  )

     {

         i_nal_type      =  NAL_SLICE ;

         i_nal_ref_idc = NAL_PRIORITY_ HIGH ;  /* Not completely true but for now it is (as all I/P are kept as ref)*/

         i_slice_type = SLICE_TYPE_ ;

     }

     else if ( h->fenc->i_type ==  X264_TYPE_P  )

     {

         i_nal_type      = NAL_SLICE;

         i_nal_ref_idc = NAL_PRIORITY_HIGH;  /* Not completely true but for now it is (as all I/P are kept as ref)*/

         i_slice_type = SLICE_TYPE_P;

     }

     else if ( h->fenc->i_type ==  X264_TYPE_BREF  )

     {

         i_nal_type      = NAL_SLICE;

         i_nal_ref_idc = NAL_PRIORITY_HIGH;  /* maybe add MMCO to forget it? -> low */

         i_slice_type = SLICE_TYPE_B;

     }

     else       /*   frame */

     {

         i_nal_type      = NAL_SLICE;

         i_nal_ref_idc = NAL_PRIORITY_DISPOSABLE;

         i_slice_type = SLICE_TYPE_B;

}

    x264_reference_reset 函数的定义如下: (其实,因为这个代码是通用的,所以应该是参考帧队列。但是,我们只用一个参考帧,“队列”并没有意义。)

static inline void  x264_reference_reset( x264_t *h )

{

     int i;

     /* reset ref pictures */

     for ( i = 1; i < h->frames.i_max_dpb; i++ )

     {

         h->frames.reference[i]->i_poc = -1;

     }

     h->frames.reference[0]->i_poc = 0;

}

     看来,好像是遇到 IDR 帧时才会 将所有的参考帧队列丢弃( x264_reference_reset ( h ); ) 。其实,我们的程序默认只用一个参考帧,这个问题就不是十分有意义了。

    多参考帧情况下。

    举个例子 :有如下帧序列: IPPPP PPP ……(我们程序没有 帧,所以帧序列简单些,但道理是一样的)。按照 个参考帧编码。

     因为“按照 个参考帧编码”,所以参考帧队列长度为 

    遇到绿色的 时,并不清空参考帧队列,把这个 帧加入参考帧队列(当然 编码时不用参考帧。)。再检测到红色的 帧时,用到的就是 PPI 三帧做参考了。

     不怕自己罗嗦(好记性不如烂笔头),再强调一个: 一个参考帧,就是参考当前帧的前面的那帧(因为没涉及到 帧,所以“前面的那帧”既是播放顺序的,也是编码顺序的)。多个参考帧是一个道理 。 ( 我以前一直误解为从前面的几帧中找到最合适的一个参考帧)

     最后,“ 但是收到 IDR 帧时,解码器另外需要做的工作就是:把所有的 PPS 和 SPS 参数进行更新。由此可见,在编码器端,每发一个 IDR ,就相应地发一个  PPS&SPS_nal_unit ”应该是对的吧。先这样认为:)

偶然机会,查到: IDR-instantaneous decoding refresh (IDR)picture 

      A coded picture in which all slices are I or SI slices that causes the decoding process to mark all reference pictures as "unused for reference" immediately after decoding the IDR picture. After the decoding of an IDR picture all following coded pictures in decoding order can be decoded without inter prediction from any picture decoded prior to the IDR picture. The first picture of each coded video sequence is an IDR picture. 
     “也就是说 ,IDR 的出现其实是相当于向解码器发出了一个清理 reference buffer 的信号吧,上面说前于这一帧的所有已编码帧不能为 inter 做参考帧了。”  

还有:“ 因为 264 采用了多帧预测,就有可能在 display order 下 帧后的 会参考 帧前的帧,这样在 random access 时如果只找 帧,随后的帧的参考帧可能 unavailable , IDR 就是这样一种特殊的 帧,把它定义为确保后面的 一定不参考其前面的帧,可以放心地 random access 

H.264视频标准中普通I帧与IDR帧的区别

http://blog.csdn.net/openspirit/article/details/10005863 普通I帧与IDR(Instantaneous Decoding Refresh...
  • zhaomax
  • zhaomax
  • 2016年08月12日 10:25
  • 742

I 帧和 IDR 帧的区别:

I 帧和 IDR 帧的区别: I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码...

I 帧和 IDR 帧的区别

I 帧和 IDR 帧的区别:     IDR 帧属于 I 帧。解码器收到 IDR frame  时,将所有的参考帧队列丢弃 (用x264_reference_reset 函数实现——在 en...
  • muwesky
  • muwesky
  • 2016年04月18日 10:12
  • 410

I帧 B帧 p帧 IDR帧的区别

IDR(Instantaneous Decoding Refresh)--即时解码刷新。  I帧:帧内编码帧是一种自带全部信息的独立帧,无需参考其它图像便可独立进行解码,视频序列中的第一个帧始终...

I 帧,B帧,P帧,IDR帧的区别

I帧:帧内编码帧 I帧特点: 1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输; 2.解码时仅用I帧的数据就可重构完整图像; 3.I帧描述了图像背景和运动主体的详情; 4.I帧不...
  • ymj321
  • ymj321
  • 2017年03月10日 15:34
  • 101

I 帧,B帧,P帧,IDR帧的区别

I 帧,B帧,P帧,IDR帧   2011-01-06 16:25:15|  分类: h.264|字号 订阅   I帧:帧内编码帧 I帧特点: 1...

I帧和IDR帧区别

I帧和IDR帧的区别:    IDR帧属于I帧。解码器收到IDR frame 时,将所有的参考帧队列丢弃(用x264_reference_reset函数实现——在encoder.c文件中)。这点是所有...
  • SkyGray
  • SkyGray
  • 2011年03月04日 15:09
  • 11300

I帧和IDR帧的区别

I帧和IDR帧的区别:     IDR帧属于I帧。解码器收到IDR frame 时,将所有的参考帧队列丢弃(用x264_reference_reset函数实现——在encoder.c文件中)。这点是...
  • c_cacal
  • c_cacal
  • 2011年08月24日 16:17
  • 397

H264中I帧和IDR帧的区别

转自:http://blog.csdn.net/Jammg/article/details/52357245 IDR(Instantaneous Decoding Refresh)-...
  • rankun1
  • rankun1
  • 2016年09月28日 14:38
  • 1099

I 帧和 IDR 帧的区别

I 帧和 IDR 帧的区别:     IDR 帧属于 I 帧。解码器收到 IDR frame  时,将所有的参考帧队列丢弃 (用x264_reference_reset 函数实现——在 encod...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:I帧和IDR帧区别
举报原因:
原因补充:

(最多只允许输入30个字)