h264.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:19k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * h264.c: h264/avc video packetizer
  3.  *****************************************************************************
  4.  * Copyright (C) 2001, 2002 VideoLAN
  5.  * $Id: h264.c 9031 2004-10-22 11:11:27Z gbazin $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Eric Petit <titer@videolan.org>
  9.  *          Gildas Bazin <gbazin@videolan.org>
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  24.  *****************************************************************************/
  25. /*****************************************************************************
  26.  * Preamble
  27.  *****************************************************************************/
  28. #include <stdlib.h>                                      /* malloc(), free() */
  29. #include <vlc/vlc.h>
  30. #include <vlc/decoder.h>
  31. #include <vlc/sout.h>
  32. #include "vlc_block_helper.h"
  33. #include "vlc_bits.h"
  34. /*****************************************************************************
  35.  * Module descriptor
  36.  *****************************************************************************/
  37. static int  Open ( vlc_object_t * );
  38. static void Close( vlc_object_t * );
  39. vlc_module_begin();
  40.     set_description( _("H264 video packetizer") );
  41.     set_capability( "packetizer", 50 );
  42.     set_callbacks( Open, Close );
  43. vlc_module_end();
  44. /****************************************************************************
  45.  * Local prototypes
  46.  ****************************************************************************/
  47. static block_t *Packetize( decoder_t *, block_t ** );
  48. static block_t *PacketizeAVC1( decoder_t *, block_t ** );
  49. struct decoder_sys_t
  50. {
  51.     block_bytestream_t bytestream;
  52.     int     i_state;
  53.     int     i_offset;
  54.     uint8_t startcode[4];
  55.     vlc_bool_t b_slice;
  56.     block_t    *p_frame;
  57.     int64_t      i_dts;
  58.     int64_t      i_pts;
  59.     unsigned int i_flags;
  60.     vlc_bool_t   b_sps;
  61.     /* avcC data */
  62.     int i_avcC_length_size;
  63.     /* Useful values of the Sequence Parameter Set */
  64.     int i_log2_max_frame_num;
  65.     int b_frame_mbs_only;
  66.     /* Useful values of the Slice Header */
  67.     int i_nal_type;
  68.     int i_nal_ref_idc;
  69.     int i_idr_pic_id;
  70.     int i_frame_num;
  71. };
  72. enum
  73. {
  74.     STATE_NOSYNC,
  75.     STATE_NEXT_SYNC,
  76. };
  77. enum nal_unit_type_e
  78. {
  79.     NAL_UNKNOWN = 0,
  80.     NAL_SLICE   = 1,
  81.     NAL_SLICE_DPA   = 2,
  82.     NAL_SLICE_DPB   = 3,
  83.     NAL_SLICE_DPC   = 4,
  84.     NAL_SLICE_IDR   = 5,    /* ref_idc != 0 */
  85.     NAL_SEI         = 6,    /* ref_idc == 0 */
  86.     NAL_SPS         = 7,
  87.     NAL_PPS         = 8
  88.     /* ref_idc == 0 for 6,9,10,11,12 */
  89. };
  90. enum nal_priority_e
  91. {
  92.     NAL_PRIORITY_DISPOSABLE = 0,
  93.     NAL_PRIORITY_LOW        = 1,
  94.     NAL_PRIORITY_HIGH       = 2,
  95.     NAL_PRIORITY_HIGHEST    = 3,
  96. };
  97. static block_t *ParseNALBlock( decoder_t *, block_t * );
  98. static block_t *nal_get_annexeb( decoder_t *, uint8_t *p, int );
  99. /*****************************************************************************
  100.  * Open: probe the packetizer and return score
  101.  *****************************************************************************/
  102. static int Open( vlc_object_t *p_this )
  103. {
  104.     decoder_t     *p_dec = (decoder_t*)p_this;
  105.     decoder_sys_t *p_sys;
  106.     if( p_dec->fmt_in.i_codec != VLC_FOURCC( 'h', '2', '6', '4') &&
  107.         p_dec->fmt_in.i_codec != VLC_FOURCC( 'H', '2', '6', '4') &&
  108.         p_dec->fmt_in.i_codec != VLC_FOURCC( 'V', 'S', 'S', 'H') &&
  109.         p_dec->fmt_in.i_codec != VLC_FOURCC( 'v', 's', 's', 'h') &&
  110.         ( p_dec->fmt_in.i_codec != VLC_FOURCC( 'a', 'v', 'c', '1') ||
  111.           p_dec->fmt_in.i_extra < 7 ) )
  112.     {
  113.         return VLC_EGENERIC;
  114.     }
  115.     /* Allocate the memory needed to store the decoder's structure */
  116.     if( ( p_dec->p_sys = p_sys = malloc( sizeof(decoder_sys_t) ) ) == NULL )
  117.     {
  118.         msg_Err( p_dec, "out of memory" );
  119.         return VLC_EGENERIC;
  120.     }
  121.     p_sys->i_state = STATE_NOSYNC;
  122.     p_sys->i_offset = 0;
  123.     p_sys->startcode[0] = 0;
  124.     p_sys->startcode[1] = 0;
  125.     p_sys->startcode[2] = 0;
  126.     p_sys->startcode[3] = 1;
  127.     p_sys->bytestream = block_BytestreamInit( p_dec );
  128.     p_sys->b_slice = VLC_FALSE;
  129.     p_sys->p_frame = NULL;
  130.     p_sys->i_dts   = 0;
  131.     p_sys->i_pts   = 0;
  132.     p_sys->i_flags = 0;
  133.     p_sys->b_sps   = VLC_FALSE;
  134.     p_sys->i_nal_type = -1;
  135.     p_sys->i_nal_ref_idc = -1;
  136.     p_sys->i_idr_pic_id = -1;
  137.     p_sys->i_frame_num = -1;
  138.     /* Setup properties */
  139.     es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
  140.     p_dec->fmt_out.i_codec = VLC_FOURCC( 'h', '2', '6', '4' );
  141.     /* FIXME: FFMPEG isn't happy at all if you leave this */
  142.     if( p_dec->fmt_out.i_extra ) free( p_dec->fmt_out.p_extra );
  143.     p_dec->fmt_out.i_extra = 0; p_dec->fmt_out.p_extra = 0;
  144.     if( p_dec->fmt_in.i_codec == VLC_FOURCC( 'a', 'v', 'c', '1' ) )
  145.     {
  146.         uint8_t *p = &((uint8_t*)p_dec->fmt_in.p_extra)[4];
  147.         int i_sps, i_pps;
  148.         int i;
  149.         /* Parse avcC */
  150.         p_sys->i_avcC_length_size = 1 + ((*p++)&0x03);
  151.         /* Read SPS */
  152.         i_sps = (*p++)&0x1f;
  153.         for( i = 0; i < i_sps; i++ )
  154.         {
  155.             int i_length = GetWBE( p );
  156.             block_t *p_sps = nal_get_annexeb( p_dec, p + 2, i_length );
  157.             ParseNALBlock( p_dec, p_sps );
  158.             p += 2 + i_length;
  159.         }
  160.         /* Read PPS */
  161.         i_pps = *p++;
  162.         for( i = 0; i < i_pps; i++ )
  163.         {
  164.             int i_length = GetWBE( p );
  165.             block_t *p_pps = nal_get_annexeb( p_dec, p + 2, i_length );
  166.             ParseNALBlock( p_dec, p_pps );
  167.             p += 2 + i_length;
  168.         }
  169.         msg_Dbg( p_dec, "avcC length size=%d sps=%d pps=%d",
  170.                  p_sys->i_avcC_length_size, i_sps, i_pps );
  171.         /* Set callback */
  172.         p_dec->pf_packetize = PacketizeAVC1;
  173.     }
  174.     else
  175.     {
  176.         /* Set callback */
  177.         p_dec->pf_packetize = Packetize;
  178.     }
  179.     return VLC_SUCCESS;
  180. }
  181. /*****************************************************************************
  182.  * Close: clean up the packetizer
  183.  *****************************************************************************/
  184. static void Close( vlc_object_t *p_this )
  185. {
  186.     decoder_t *p_dec = (decoder_t*)p_this;
  187.     decoder_sys_t *p_sys = p_dec->p_sys;
  188.     block_BytestreamRelease( &p_sys->bytestream );
  189.     free( p_sys );
  190. }
  191. /****************************************************************************
  192.  * Packetize: the whole thing
  193.  ****************************************************************************/
  194. static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
  195. {
  196.     decoder_sys_t *p_sys = p_dec->p_sys;
  197.     block_t       *p_pic;
  198.     if( !pp_block || !*pp_block ) return NULL;
  199.     block_BytestreamPush( &p_sys->bytestream, *pp_block );
  200.     for( ;; )
  201.     {
  202.         switch( p_sys->i_state )
  203.         {
  204.             case STATE_NOSYNC:
  205.                 if( block_FindStartcodeFromOffset( &p_sys->bytestream,
  206.                       &p_sys->i_offset, p_sys->startcode+1, 3 ) == VLC_SUCCESS)
  207.                 {
  208.                     p_sys->i_state = STATE_NEXT_SYNC;
  209.                 }
  210.                 if( p_sys->i_offset )
  211.                 {
  212.                     block_SkipBytes( &p_sys->bytestream, p_sys->i_offset );
  213.                     p_sys->i_offset = 0;
  214.                     block_BytestreamFlush( &p_sys->bytestream );
  215.                 }
  216.                 if( p_sys->i_state != STATE_NEXT_SYNC )
  217.                 {
  218.                     /* Need more data */
  219.                     return NULL;
  220.                 }
  221.                 p_sys->i_offset = 1; /* To find next startcode */
  222.             case STATE_NEXT_SYNC:
  223.                 /* Find the next startcode */
  224.                 if( block_FindStartcodeFromOffset( &p_sys->bytestream,
  225.                       &p_sys->i_offset, p_sys->startcode, 3 ) != VLC_SUCCESS)
  226.                 {
  227.                     if( block_FindStartcodeFromOffset( &p_sys->bytestream,
  228.                           &p_sys->i_offset, p_sys->startcode+1, 3 ) !=
  229.                         VLC_SUCCESS )
  230.                     {
  231.                         /* Need more data */
  232.                         return NULL;
  233.                     }
  234.                 }
  235.                 /* Get the new fragment and set the pts/dts */
  236.                 p_pic = block_New( p_dec, p_sys->i_offset );
  237.                 p_pic->i_pts = p_sys->bytestream.p_block->i_pts;
  238.                 p_pic->i_dts = p_sys->bytestream.p_block->i_dts;
  239.                 block_GetBytes( &p_sys->bytestream, p_pic->p_buffer,
  240.                                 p_pic->i_buffer );
  241.                 p_sys->i_offset = 0;
  242.                 /* Parse the NAL */
  243.                 if( !( p_pic = ParseNALBlock( p_dec, p_pic ) ) )
  244.                 {
  245.                     p_sys->i_state = STATE_NOSYNC;
  246.                     break;
  247.                 }
  248.                 /* So p_block doesn't get re-added several times */
  249.                 *pp_block = block_BytestreamPop( &p_sys->bytestream );
  250.                 p_sys->i_state = STATE_NOSYNC;
  251.                 return p_pic;
  252.         }
  253.     }
  254. }
  255. /****************************************************************************
  256.  * PacketizeAVC1: the whole thing
  257.  ****************************************************************************/
  258. static block_t *PacketizeAVC1( decoder_t *p_dec, block_t **pp_block )
  259. {
  260.     decoder_sys_t *p_sys = p_dec->p_sys;
  261.     block_t       *p_block;
  262.     block_t       *p_ret = NULL;
  263.     uint8_t       *p;
  264.     if( !pp_block || !*pp_block ) return NULL;
  265.     p_block = *pp_block;
  266.     *pp_block = NULL;
  267.     for( p = p_block->p_buffer; p < &p_block->p_buffer[p_block->i_buffer]; )
  268.     {
  269.         block_t *p_pic;
  270.         int i_size = 0;
  271.         int i;
  272.         for( i = 0; i < p_sys->i_avcC_length_size; i++ )
  273.         {
  274.             i_size = (i_size << 8) | (*p++);
  275.         }
  276.         if( i_size > 0 )
  277.         {
  278.             block_t *p_part = nal_get_annexeb( p_dec, p, i_size );
  279.             p_part->i_dts = p_block->i_dts;
  280.             p_part->i_pts = p_block->i_pts;
  281.             /* Parse the NAL */
  282.             if( ( p_pic = ParseNALBlock( p_dec, p_part ) ) )
  283.             {
  284.                 block_ChainAppend( &p_ret, p_pic );
  285.             }
  286.         }
  287.         p += i_size;
  288.     }
  289.     return p_ret;
  290. }
  291. static block_t *nal_get_annexeb( decoder_t *p_dec, uint8_t *p, int i_size )
  292. {
  293.     block_t *p_nal;
  294.     p_nal = block_New( p_dec, 3 + i_size );
  295.     /* Add start code */
  296.     p_nal->p_buffer[0] = 0x00;
  297.     p_nal->p_buffer[1] = 0x00;
  298.     p_nal->p_buffer[2] = 0x01;
  299.     /* Copy nalu */
  300.     memcpy( &p_nal->p_buffer[3], p, i_size );
  301.     return p_nal;
  302. }
  303. static void nal_get_decoded( uint8_t **pp_ret, int *pi_ret,
  304.                              uint8_t *src, int i_src )
  305. {
  306.     uint8_t *end = &src[i_src];
  307.     uint8_t *dst = malloc( i_src );
  308.     *pp_ret = dst;
  309.     while( src < end )
  310.     {
  311.         if( src < end - 3 && src[0] == 0x00 && src[1] == 0x00 &&
  312.             src[2] == 0x03 )
  313.         {
  314.             *dst++ = 0x00;
  315.             *dst++ = 0x00;
  316.             src += 3;
  317.             continue;
  318.         }
  319.         *dst++ = *src++;
  320.     }
  321.     *pi_ret = dst - *pp_ret;
  322. }
  323. static inline int bs_read_ue( bs_t *s )
  324. {
  325.     int i = 0;
  326.     while( bs_read1( s ) == 0 && s->p < s->p_end && i < 32 )
  327.     {
  328.         i++;
  329.     }
  330.     return( ( 1 << i) - 1 + bs_read( s, i ) );
  331. }
  332. static inline int bs_read_se( bs_t *s )
  333. {
  334.     int val = bs_read_ue( s );
  335.     return val&0x01 ? (val+1)/2 : -(val/2);
  336. }
  337. static block_t *ParseNALBlock( decoder_t *p_dec, block_t *p_frag )
  338. {
  339.     decoder_sys_t *p_sys = p_dec->p_sys;
  340.     block_t *p_pic = NULL;
  341.     const int i_nal_ref_idc = (p_frag->p_buffer[3] >> 5)&0x03;
  342.     const int i_nal_type = p_frag->p_buffer[3]&0x1f;
  343.     if( p_sys->b_slice && !p_sys->b_sps )
  344.     {
  345.         block_ChainRelease( p_sys->p_frame );
  346.         msg_Warn( p_dec, "waiting for SPS" );
  347.         /* Reset context */
  348.         p_sys->p_frame = NULL;
  349.         p_sys->b_slice = VLC_FALSE;
  350.     }
  351.     if( !p_sys->b_sps &&
  352.         i_nal_type >= NAL_SLICE && i_nal_type <= NAL_SLICE_IDR )
  353.     {
  354.         p_sys->b_slice = VLC_TRUE;
  355.         /* Fragment will be discarded later on */
  356.     }
  357.     else if( i_nal_type >= NAL_SLICE && i_nal_type <= NAL_SLICE_IDR )
  358.     {
  359.         uint8_t *dec;
  360.         int i_dec, i_first_mb, i_slice_type, i_frame_num, i_pic_flags = 0;
  361.         vlc_bool_t b_pic = VLC_FALSE;
  362.         bs_t s;
  363.         /* do not convert the whole frame */
  364.         nal_get_decoded( &dec, &i_dec, &p_frag->p_buffer[4],
  365.                          __MIN( p_frag->i_buffer - 4, 60 ) );
  366.         bs_init( &s, dec, i_dec );
  367.         /* first_mb_in_slice */
  368.         i_first_mb = bs_read_ue( &s );
  369.         /* slice_type */
  370.         switch( (i_slice_type = bs_read_ue( &s )) )
  371.         {
  372.             case 0: case 5:
  373.                 i_pic_flags = BLOCK_FLAG_TYPE_P;
  374.                 break;
  375.             case 1: case 6:
  376.                 i_pic_flags = BLOCK_FLAG_TYPE_B;
  377.                 break;
  378.             case 2: case 7:
  379.                 i_pic_flags = BLOCK_FLAG_TYPE_I;
  380.                 break;
  381.             case 3: case 8: /* SP */
  382.                 i_pic_flags = BLOCK_FLAG_TYPE_P;
  383.                 break;
  384.             case 4: case 9:
  385.                 i_pic_flags = BLOCK_FLAG_TYPE_I;
  386.                 break;
  387.         }
  388.         /* pic_parameter_set_id */
  389.         bs_read_ue( &s );
  390.         /* frame_num */
  391.         i_frame_num = bs_read( &s, p_sys->i_log2_max_frame_num + 4 );
  392.         /* Detection of the first VCL NAL unit of a primary coded picture
  393.          * (cf. 7.4.1.2.4) */
  394.         if( i_frame_num != p_sys->i_frame_num ||
  395.             ( (i_nal_ref_idc != p_sys->i_nal_ref_idc) &&
  396.               (!i_nal_ref_idc || !p_sys->i_nal_ref_idc) ) )
  397.         {
  398.             b_pic = VLC_TRUE;
  399.         }
  400.         p_sys->i_frame_num = i_frame_num;
  401.         p_sys->i_nal_ref_idc = i_nal_ref_idc;
  402.         if( !p_sys->b_frame_mbs_only )
  403.         {
  404.             /* field_pic_flag */
  405.             if( bs_read( &s, 1 ) )
  406.             {
  407.                 /* bottom_field_flag */
  408.                 bs_read( &s, 1 );
  409.             }
  410.         }
  411.         if( i_nal_type == NAL_SLICE_IDR )
  412.         {
  413.             /* id_pic_id */
  414.             int i_idr_pic_id = bs_read_ue( &s );
  415.             if( p_sys->i_nal_type != i_nal_type ) b_pic = VLC_TRUE;
  416.             if( p_sys->i_idr_pic_id != i_idr_pic_id ) b_pic = VLC_TRUE;
  417.             p_sys->i_idr_pic_id = i_idr_pic_id;
  418.         }
  419.         p_sys->i_nal_type = i_nal_type;
  420.         if( b_pic && p_sys->b_slice )
  421.         {
  422.             p_pic = block_ChainGather( p_sys->p_frame );
  423.             p_pic->i_dts = p_sys->i_dts;
  424.             p_pic->i_pts = p_sys->i_pts;
  425.             p_pic->i_length = 0;    /* FIXME */
  426.             p_pic->i_flags = p_sys->i_flags;
  427.             /* Reset context */
  428.             p_sys->p_frame = NULL;
  429.             p_sys->b_slice = VLC_FALSE;
  430.         }
  431.         p_sys->b_slice = VLC_TRUE;
  432.         p_sys->i_flags = i_pic_flags;
  433.         p_sys->i_dts   = p_frag->i_dts;
  434.         p_sys->i_pts   = p_frag->i_pts;
  435.         free( dec );
  436.     }
  437.     else if( i_nal_type == NAL_SPS )
  438.     {
  439.         uint8_t *dec;
  440.         int     i_dec;
  441.         bs_t s;
  442.         int i_tmp;
  443.         msg_Dbg( p_dec, "found NAL_SPS" );
  444.         p_sys->b_sps = VLC_TRUE;
  445.         nal_get_decoded( &dec, &i_dec, &p_frag->p_buffer[4],
  446.                          p_frag->i_buffer - 4 );
  447.         bs_init( &s, dec, i_dec );
  448.         /* Skip profile(8), constraint_set012, reserver(5), level(8) */
  449.         bs_skip( &s, 8 + 1+1+1 + 5 + 8 );
  450.         /* sps id */
  451.         bs_read_ue( &s );
  452.         /* Skip i_log2_max_frame_num */
  453.         p_sys->i_log2_max_frame_num = bs_read_ue( &s );
  454.         /* Read poc_type */
  455.         i_tmp = bs_read_ue( &s );
  456.         if( i_tmp == 0 )
  457.         {
  458.             /* skip i_log2_max_poc_lsb */
  459.             bs_read_ue( &s );
  460.         }
  461.         else if( i_tmp == 1 )
  462.         {
  463.             int i_cycle;
  464.             /* skip b_delta_pic_order_always_zero */
  465.             bs_skip( &s, 1 );
  466.             /* skip i_offset_for_non_ref_pic */
  467.             bs_read_se( &s );
  468.             /* skip i_offset_for_top_to_bottom_field */
  469.             bs_read_se( &s );
  470.             /* read i_num_ref_frames_in_poc_cycle */
  471.             i_cycle = bs_read_ue( &s );
  472.             if( i_cycle > 256 ) i_cycle = 256;
  473.             while( i_cycle > 0 )
  474.             {
  475.                 /* skip i_offset_for_ref_frame */
  476.                 bs_read_se(&s );
  477.             }
  478.         }
  479.         /* i_num_ref_frames */
  480.         bs_read_ue( &s );
  481.         /* b_gaps_in_frame_num_value_allowed */
  482.         bs_skip( &s, 1 );
  483.         /* Read size */
  484.         p_dec->fmt_out.video.i_width  = 16 * ( bs_read_ue( &s ) + 1 );
  485.         p_dec->fmt_out.video.i_height = 16 * ( bs_read_ue( &s ) + 1 );
  486.         /* b_frame_mbs_only */
  487.         p_sys->b_frame_mbs_only = bs_read( &s, 1 );
  488.         if( p_sys->b_frame_mbs_only == 0 )
  489.         {
  490.             bs_skip( &s, 1 );
  491.         }
  492.         /* b_direct8x8_inference */
  493.         bs_skip( &s, 1 );
  494.         /* crop */
  495.         i_tmp = bs_read( &s, 1 );
  496.         if( i_tmp )
  497.         {
  498.             /* left */
  499.             bs_read_ue( &s );
  500.             /* right */
  501.             bs_read_ue( &s );
  502.             /* top */
  503.             bs_read_ue( &s );
  504.             /* bottom */
  505.             bs_read_ue( &s );
  506.         }
  507.         /* vui */
  508.         i_tmp = bs_read( &s, 1 );
  509.         if( i_tmp )
  510.         {
  511.             /* read the aspect ratio part if any FIXME check it */
  512.             i_tmp = bs_read( &s, 1 );
  513.             if( i_tmp )
  514.             {
  515.                 static const struct { int w, h; } sar[14] =
  516.                 {
  517.                     { 0,   0 }, { 1,   1 }, { 12, 11 }, { 10, 11 },
  518.                     { 16, 11 }, { 40, 33 }, { 24, 11 }, { 20, 11 },
  519.                     { 32, 11 }, { 80, 33 }, { 18, 11 }, { 15, 11 },
  520.                     { 64, 33 }, { 160,99 },
  521.                 };
  522.                 int i_sar = bs_read( &s, 8 );
  523.                 int w, h;
  524.                 if( i_sar < 14 )
  525.                 {
  526.                     w = sar[i_sar].w;
  527.                     h = sar[i_sar].h;
  528.                 }
  529.                 else
  530.                 {
  531.                     w = bs_read( &s, 16 );
  532.                     h = bs_read( &s, 16 );
  533.                 }
  534.                 p_dec->fmt_out.video.i_aspect =
  535.                     VOUT_ASPECT_FACTOR * w / h * p_dec->fmt_out.video.i_width /
  536.                     p_dec->fmt_out.video.i_height;
  537.             }
  538.         }
  539.         free( dec );
  540.     }
  541.     else if( i_nal_type == NAL_PPS )
  542.     {
  543.         bs_t s;
  544.         bs_init( &s, &p_frag->p_buffer[4], p_frag->i_buffer - 4 );
  545.         /* TODO */
  546.         msg_Dbg( p_dec, "found NAL_PPS" );
  547.     }
  548.     /* Append the block */
  549.     block_ChainAppend( &p_sys->p_frame, p_frag );
  550.     return p_pic;
  551. }