decoder.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:21k
源码类别:

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * x264: h264 decoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 Laurent Aimar
  5.  * $Id: decoder.c,v 1.1 2004/06/03 19:27:07 fenrir Exp $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include <stdint.h>
  27. #include "common/common.h"
  28. #include "common/cpu.h"
  29. #include "common/vlc.h"
  30. #include "macroblock.h"
  31. #include "set.h"
  32. #include "vlc.h"
  33. static void x264_slice_idr( x264_t *h )
  34. {
  35.     int i;
  36.     h->i_poc_msb = 0;
  37.     h->i_poc_lsb = 0;
  38.     h->i_frame_offset = 0;
  39.     h->i_frame_num = 0;
  40.     if( h->sps )
  41.     {
  42.         for( i = 0; i < h->sps->i_num_ref_frames + 1; i++ )
  43.         {
  44.             h->freference[i]->i_poc = -1;
  45.         }
  46.         h->fdec = h->freference[0];
  47.         h->i_ref0 = 0;
  48.         h->i_ref1 = 0;
  49.     }
  50. }
  51. /* The slice reading is split in two part:
  52.  *      - before ref_pic_list_reordering( )
  53.  *      - after  dec_ref_pic_marking( )
  54.  */
  55. static int x264_slice_header_part1_read( bs_t *s,
  56.                                          x264_slice_header_t *sh, x264_sps_t sps_array[32], x264_pps_t pps_array[256], int b_idr )
  57. {
  58.     sh->i_first_mb = bs_read_ue( s );
  59.     sh->i_type = bs_read_ue( s );
  60.     if( sh->i_type >= 5 )
  61.     {
  62.         sh->i_type -= 5;
  63.     }
  64.     sh->i_pps_id = bs_read_ue( s );
  65.     if( bs_eof( s ) || sh->i_pps_id >= 256 || pps_array[sh->i_pps_id].i_id == -1 )
  66.     {
  67.         fprintf( stderr, "invalid pps_id in slice headern" );
  68.         return -1;
  69.     }
  70.     sh->pps = &pps_array[sh->i_pps_id];
  71.     sh->sps = &sps_array[sh->pps->i_sps_id];    /* valid if pps valid */
  72.     sh->i_frame_num = bs_read( s, sh->sps->i_log2_max_frame_num );
  73.     if( !sh->sps->b_frame_mbs_only )
  74.     {
  75.         sh->b_field_pic = bs_read1( s );
  76.         if( sh->b_field_pic )
  77.         {
  78.             sh->b_bottom_field = bs_read1( s );
  79.         }
  80.     }
  81.     if( b_idr )
  82.     {
  83.         sh->i_idr_pic_id = bs_read_ue( s );
  84.     }
  85.     else
  86.     {
  87.         sh->i_idr_pic_id = 0;
  88.     }
  89.     if( sh->sps->i_poc_type == 0 )
  90.     {
  91.         sh->i_poc_lsb = bs_read( s, sh->sps->i_log2_max_poc_lsb );
  92.         if( sh->pps->b_pic_order && !sh->b_field_pic )
  93.         {
  94.             sh->i_delta_poc_bottom = bs_read_se( s );
  95.         }
  96.     }
  97.     else if( sh->sps->i_poc_type == 1 && !sh->sps->b_delta_pic_order_always_zero )
  98.     {
  99.         sh->i_delta_poc[0] = bs_read_se( s );
  100.         if( sh->pps->b_pic_order && !sh->b_field_pic )
  101.         {
  102.             sh->i_delta_poc[1] = bs_read_se( s );
  103.         }
  104.     }
  105.     if( sh->pps->b_redundant_pic_cnt )
  106.     {
  107.         sh->i_redundant_pic_cnt = bs_read_ue( s );
  108.     }
  109.     if( sh->i_type == SLICE_TYPE_B )
  110.     {
  111.         sh->b_direct_spatial_mv_pred = bs_read1( s );
  112.     }
  113.     if( sh->i_type == SLICE_TYPE_P || sh->i_type == SLICE_TYPE_SP || sh->i_type == SLICE_TYPE_B )
  114.     {
  115.         sh->b_num_ref_idx_override = bs_read1( s );
  116.         sh->i_num_ref_idx_l0_active = sh->pps->i_num_ref_idx_l0_active; /* default */
  117.         sh->i_num_ref_idx_l1_active = sh->pps->i_num_ref_idx_l1_active; /* default */
  118.         if( sh->b_num_ref_idx_override )
  119.         {
  120.             sh->i_num_ref_idx_l0_active = bs_read_ue( s ) + 1;
  121.             if( sh->i_type == SLICE_TYPE_B )
  122.             {
  123.                 sh->i_num_ref_idx_l1_active = bs_read_ue( s ) + 1;
  124.             }
  125.         }
  126.     }
  127.     return bs_eof( s ) ? -1 : 0;
  128. }
  129. static int x264_slice_header_part2_read( bs_t *s, x264_slice_header_t *sh )
  130. {
  131.     if( sh->pps->b_cabac && sh->i_type != SLICE_TYPE_I && sh->i_type != SLICE_TYPE_SI )
  132.     {
  133.         sh->i_cabac_init_idc = bs_read_ue( s );
  134.     }
  135.     sh->i_qp_delta = bs_read_se( s );
  136.     if( sh->i_type == SLICE_TYPE_SI || sh->i_type == SLICE_TYPE_SP )
  137.     {
  138.         if( sh->i_type == SLICE_TYPE_SP )
  139.         {
  140.             sh->b_sp_for_swidth = bs_read1( s );
  141.         }
  142.         sh->i_qs_delta = bs_read_se( s );
  143.     }
  144.     if( sh->pps->b_deblocking_filter_control )
  145.     {
  146.         sh->i_disable_deblocking_filter_idc = bs_read_ue( s );
  147.         if( sh->i_disable_deblocking_filter_idc != 1 )
  148.         {
  149.             sh->i_alpha_c0_offset = bs_read_se( s );
  150.             sh->i_beta_offset = bs_read_se( s );
  151.         }
  152.     }
  153.     else
  154.     {
  155.         sh->i_alpha_c0_offset = 0;
  156.         sh->i_beta_offset = 0;
  157.     }
  158.     if( sh->pps->i_num_slice_groups > 1 && sh->pps->i_slice_group_map_type >= 3 && sh->pps->i_slice_group_map_type <= 5 )
  159.     {
  160.         /* FIXME */
  161.         return -1;
  162.     }
  163.     return 0;
  164. }
  165. static int x264_slice_header_ref_pic_reordering( x264_t *h, bs_t *s )
  166. {
  167.     int b_ok;
  168.     int i;
  169.     /* use the no more use frame */
  170.     h->fdec = h->freference[0];
  171.     h->fdec->i_poc = h->i_poc;
  172.     /* build ref list 0/1 */
  173.     h->i_ref0 = 0;
  174.     h->i_ref1 = 0;
  175.     for( i = 1; i < h->sps->i_num_ref_frames + 1; i++ )
  176.     {
  177.         if( h->freference[i]->i_poc >= 0 )
  178.         {
  179.             if( h->freference[i]->i_poc < h->fdec->i_poc )
  180.             {
  181.                 h->fref0[h->i_ref0++] = h->freference[i];
  182.             }
  183.             else if( h->freference[i]->i_poc > h->fdec->i_poc )
  184.             {
  185.                 h->fref1[h->i_ref1++] = h->freference[i];
  186.             }
  187.         }
  188.     }
  189.     /* Order ref0 from higher to lower poc */
  190.     do
  191.     {
  192.         b_ok = 1;
  193.         for( i = 0; i < h->i_ref0 - 1; i++ )
  194.         {
  195.             if( h->fref0[i]->i_poc < h->fref0[i+1]->i_poc )
  196.             {
  197.                 x264_frame_t *tmp = h->fref0[i+1];
  198.                 h->fref0[i+1] = h->fref0[i];
  199.                 h->fref0[i] = tmp;
  200.                 b_ok = 0;
  201.                 break;
  202.             }
  203.         }
  204.     } while( !b_ok );
  205.     /* Order ref1 from lower to higher poc (bubble sort) for B-frame */
  206.     do
  207.     {
  208.         b_ok = 1;
  209.         for( i = 0; i < h->i_ref1 - 1; i++ )
  210.         {
  211.             if( h->fref1[i]->i_poc > h->fref1[i+1]->i_poc )
  212.             {
  213.                 x264_frame_t *tmp = h->fref1[i+1];
  214.                 h->fref1[i+1] = h->fref1[i];
  215.                 h->fref1[i] = tmp;
  216.                 b_ok = 0;
  217.                 break;
  218.             }
  219.         }
  220.     } while( !b_ok );
  221.     if( h->i_ref0 > h->pps->i_num_ref_idx_l0_active )
  222.     {
  223.         h->i_ref0 = h->pps->i_num_ref_idx_l0_active;
  224.     }
  225.     if( h->i_ref1 > h->pps->i_num_ref_idx_l1_active )
  226.     {
  227.         h->i_ref1 = h->pps->i_num_ref_idx_l1_active;
  228.     }
  229.     //fprintf( stderr,"POC:%d ref0=%d POC0=%dn", h->fdec->i_poc, h->i_ref0, h->i_ref0 > 0 ? h->fref0[0]->i_poc : -1 );
  230.     /* Now parse the stream and change the default order */
  231.     if( h->sh.i_type != SLICE_TYPE_I && h->sh.i_type != SLICE_TYPE_SI )
  232.     {
  233.         int b_reorder = bs_read1( s );
  234.         if( b_reorder )
  235.         {
  236.             /* FIXME */
  237.             return -1;
  238.         }
  239.     }
  240.     if( h->sh.i_type == SLICE_TYPE_B )
  241.     {
  242.         int b_reorder = bs_read1( s );
  243.         if( b_reorder )
  244.         {
  245.             /* FIXME */
  246.             return -1;
  247.         }
  248.     }
  249.     return 0;
  250. }
  251. static int x264_slice_header_pred_weight_table( x264_t *h, bs_t *s )
  252. {
  253.     return -1;
  254. }
  255. static int  x264_slice_header_dec_ref_pic_marking( x264_t *h, bs_t *s, int i_nal_type  )
  256. {
  257.     if( i_nal_type == NAL_SLICE_IDR )
  258.     {
  259.         int b_no_output_of_prior_pics = bs_read1( s );
  260.         int b_long_term_reference_flag = bs_read1( s );
  261.         /* TODO */
  262.         if( b_no_output_of_prior_pics )
  263.         {
  264.         }
  265.         if( b_long_term_reference_flag )
  266.         {
  267.         }
  268.     }
  269.     else
  270.     {
  271.         int b_adaptive_ref_pic_marking_mode = bs_read1( s );
  272.         if( b_adaptive_ref_pic_marking_mode )
  273.         {
  274.             return -1;
  275.         }
  276.     }
  277.     return 0;
  278. }
  279. /****************************************************************************
  280.  * Decode a slice header and setup h for mb decoding.
  281.  ****************************************************************************/
  282. static int x264_slice_header_decode( x264_t *h, bs_t *s, x264_nal_t *nal )
  283. {
  284.     /* read the first part of the slice */
  285.     if( x264_slice_header_part1_read( s, &h->sh,
  286.                                       h->sps_array, h->pps_array,
  287.                                       nal->i_type == NAL_SLICE_IDR ? 1 : 0 ) < 0 )
  288.     {
  289.         fprintf( stderr, "x264_slice_header_part1_read failedn" );
  290.         return -1;
  291.     }
  292.     /* now reset h if needed for this frame */
  293.     if( h->sps != h->sh.sps || h->pps != h->sh.pps )
  294.     {
  295.         int i;
  296.         /* TODO */
  297.         h->sps = NULL;
  298.         h->pps = NULL;
  299.         if( h->picture->i_width != 0 && h->picture->i_height != 0 )
  300.         {
  301.             for( i = 0; i < h->sps->i_num_ref_frames + 1; i++ )
  302.             {
  303.                 x264_frame_delete( h->freference[i]);
  304.             }
  305.             free( h->mb );
  306.         }
  307.         h->picture->i_width = 0;
  308.         h->picture->i_height = 0;
  309.     }
  310.     /* and init if needed */
  311.     if( h->sps == NULL || h->pps == NULL )
  312.     {
  313.         int i;
  314.         h->sps = h->sh.sps;
  315.         h->pps = h->sh.pps;
  316.         h->param.i_width = h->picture->i_width = 16 * h->sps->i_mb_width;
  317.         h->param.i_height= h->picture->i_height= 16 * h->sps->i_mb_height;
  318.         fprintf( stderr, "x264: %dx%dn", h->picture->i_width, h->picture->i_height );
  319.         h->mb = x264_macroblocks_new( h->sps->i_mb_width, h->sps->i_mb_height );
  320.         for( i = 0; i < h->sps->i_num_ref_frames + 1; i++ )
  321.         {
  322.             h->freference[i] = x264_frame_new( h );
  323.             h->freference[i]->i_poc = -1;
  324.         }
  325.         h->fdec = h->freference[0];
  326.         h->i_ref0 = 0;
  327.         h->i_ref1 = 0;
  328.         h->i_poc_msb = 0;
  329.         h->i_poc_lsb = 0;
  330.         h->i_frame_offset = 0;
  331.         h->i_frame_num = 0;
  332.     }
  333.     /* calculate poc for current frame */
  334.     if( h->sps->i_poc_type == 0 )
  335.     {
  336.         int i_max_poc_lsb = 1 << h->sps->i_log2_max_poc_lsb;
  337.         if( h->sh.i_poc_lsb < h->i_poc_lsb && h->i_poc_lsb - h->sh.i_poc_lsb >= i_max_poc_lsb/2 )
  338.         {
  339.             h->i_poc_msb += i_max_poc_lsb;
  340.         }
  341.         else if( h->sh.i_poc_lsb > h->i_poc_lsb  && h->sh.i_poc_lsb - h->i_poc_lsb > i_max_poc_lsb/2 )
  342.         {
  343.             h->i_poc_msb -= i_max_poc_lsb;
  344.         }
  345.         h->i_poc_lsb = h->sh.i_poc_lsb;
  346.         h->i_poc = h->i_poc_msb + h->sh.i_poc_lsb;
  347.     }
  348.     else if( h->sps->i_poc_type == 1 )
  349.     {
  350.         /* FIXME */
  351.         return -1;
  352.     }
  353.     else
  354.     {
  355.         if( nal->i_type == NAL_SLICE_IDR )
  356.         {
  357.             h->i_frame_offset = 0;
  358.             h->i_poc = 0;
  359.         }
  360.         else
  361.         {
  362.             if( h->sh.i_frame_num < h->i_frame_num )
  363.             {
  364.                 h->i_frame_offset += 1 << h->sps->i_log2_max_frame_num;
  365.             }
  366.             if( nal->i_ref_idc > 0 )
  367.             {
  368.                 h->i_poc = 2 * ( h->i_frame_offset + h->sh.i_frame_num );
  369.             }
  370.             else
  371.             {
  372.                 h->i_poc = 2 * ( h->i_frame_offset + h->sh.i_frame_num ) - 1;
  373.             }
  374.         }
  375.         h->i_frame_num = h->sh.i_frame_num;
  376.     }
  377.     fprintf( stderr, "x264: pic type=%s poc:%dn",
  378.              h->sh.i_type == SLICE_TYPE_I ? "I" : (h->sh.i_type == SLICE_TYPE_P ? "P" : "B?" ),
  379.              h->i_poc );
  380.     if( h->sh.i_type != SLICE_TYPE_I && h->sh.i_type != SLICE_TYPE_P )
  381.     {
  382.         fprintf( stderr, "only SLICE I/P supportedn" );
  383.         return -1;
  384.     }
  385.     /* read and do the ref pic reordering */
  386.     if( x264_slice_header_ref_pic_reordering( h, s ) < 0 )
  387.     {
  388.         return -1;
  389.     }
  390.     if( ( (h->sh.i_type == SLICE_TYPE_P || h->sh.i_type == SLICE_TYPE_SP) && h->sh.pps->b_weighted_pred  ) ||
  391.         ( h->sh.i_type == SLICE_TYPE_B && h->sh.pps->b_weighted_bipred ) )
  392.     {
  393.         if( x264_slice_header_pred_weight_table( h, s ) < 0 )
  394.         {
  395.             return -1;
  396.         }
  397.     }
  398.     if( nal->i_ref_idc != 0 )
  399.     {
  400.         x264_slice_header_dec_ref_pic_marking( h, s, nal->i_type );
  401.     }
  402.     if( x264_slice_header_part2_read( s, &h->sh ) < 0 )
  403.     {
  404.         return -1;
  405.     }
  406.     return 0;
  407. }
  408. static int x264_slice_data_decode( x264_t *h, bs_t *s )
  409. {
  410.     int mb_xy = h->sh.i_first_mb;
  411.     int i_ret = 0;
  412.     if( h->pps->b_cabac )
  413.     {
  414.         /* TODO: alignement and cabac init */
  415.     }
  416.     /* FIXME field decoding */
  417.     for( ;; )
  418.     {
  419.         x264_mb_context_t context;
  420.         x264_macroblock_t *mb;
  421.         if( mb_xy >= h->sps->i_mb_width * h->sps->i_mb_height )
  422.         {
  423.             break;
  424.         }
  425.         mb = &h->mb[mb_xy];
  426.         /* load neighbour */
  427.         x264_macroblock_context_load( h, mb, &context );
  428.         if( h->pps->b_cabac )
  429.         {
  430.             if( h->sh.i_type != SLICE_TYPE_I && h->sh.i_type != SLICE_TYPE_SI )
  431.             {
  432.                 /* TODO */
  433.             }
  434.             i_ret = x264_macroblock_read_cabac( h, s, mb );
  435.         }
  436.         else
  437.         {
  438.             if( h->sh.i_type != SLICE_TYPE_I && h->sh.i_type != SLICE_TYPE_SI )
  439.             {
  440.                 int i_skip = bs_read_ue( s );
  441.                 while( i_skip > 0 )
  442.                 {
  443.                     x264_macroblock_decode_skip( h, mb );
  444.                     /* next macroblock */
  445.                     mb_xy++;
  446.                     if( mb_xy >= h->sps->i_mb_width * h->sps->i_mb_height )
  447.                     {
  448.                         break;
  449.                     }
  450.                     mb++;
  451.                     /* load neighbour */
  452.                     x264_macroblock_context_load( h, mb, &context );
  453.                     i_skip--;
  454.                 }
  455.                 if( mb_xy >= h->sps->i_mb_width * h->sps->i_mb_height )
  456.                 {
  457.                     break;
  458.                 }
  459.             }
  460.             i_ret = x264_macroblock_read_cavlc( h, s, mb );
  461.         }
  462.         if( i_ret < 0 )
  463.         {
  464.             fprintf( stderr, "x264_macroblock_read failed [%d,%d]n", mb->i_mb_x, mb->i_mb_y );
  465.             break;
  466.         }
  467.         if( x264_macroblock_decode( h, mb ) < 0 )
  468.         {
  469.             fprintf( stderr, "x264_macroblock_decode failedn" );
  470.             /* try to do some error correction ;) */
  471.         }
  472.         mb_xy++;
  473.     }
  474.     if( i_ret >= 0 )
  475.     {
  476.         int i;
  477.         /* expand border for frame reference TODO avoid it when using b-frame */
  478.         x264_frame_expand_border( h->fdec );
  479.         /* apply deblocking filter to the current decoded picture */
  480.         if( !h->pps->b_deblocking_filter_control || h->sh.i_disable_deblocking_filter_idc != 1 )
  481.         {
  482.             x264_frame_deblocking_filter( h, h->sh.i_type );
  483.         }
  484. #if 0
  485.         /* expand border for frame reference TODO avoid it when using b-frame */
  486.         x264_frame_expand_border( h->fdec );
  487. #endif
  488.         h->picture->i_plane = h->fdec->i_plane;
  489.         for( i = 0; i < h->picture->i_plane; i++ )
  490.         {
  491.             h->picture->i_stride[i] = h->fdec->i_stride[i];
  492.             h->picture->plane[i]    = h->fdec->plane[i];
  493.         }
  494.         /* move frame in the buffer FIXME won't work for B-frame */
  495.         h->fdec = h->freference[h->sps->i_num_ref_frames];
  496.         for( i = h->sps->i_num_ref_frames; i > 0; i-- )
  497.         {
  498.             h->freference[i] = h->freference[i-1];
  499.         }
  500.         h->freference[0] = h->fdec;
  501.     }
  502.     return i_ret;
  503. }
  504. /****************************************************************************
  505.  *
  506.  ******************************* x264 libs **********************************
  507.  *
  508.  ****************************************************************************/
  509. /****************************************************************************
  510.  * x264_decoder_open:
  511.  ****************************************************************************/
  512. x264_t *x264_decoder_open   ( x264_param_t *param )
  513. {
  514.     x264_t *h = x264_malloc( sizeof( x264_t ) );
  515.     int i;
  516.     memcpy( &h->param, param, sizeof( x264_param_t ) );
  517.     h->cpu = param->cpu;
  518.     /* no SPS and PPS active yet */
  519.     h->sps = NULL;
  520.     h->pps = NULL;
  521.     for( i = 0; i < 32; i++ )
  522.     {
  523.         h->sps_array[i].i_id = -1;  /* invalidate it */
  524.     }
  525.     for( i = 0; i < 256; i++ )
  526.     {
  527.         h->pps_array[i].i_id = -1;  /* invalidate it */
  528.     }
  529.     h->picture = x264_malloc( sizeof( x264_picture_t ) );
  530.     h->picture->i_width = 0;
  531.     h->picture->i_height= 0;
  532.     /* init predict_XxX */
  533.     x264_predict_16x16_init( h->cpu, h->predict_16x16 );
  534.     x264_predict_8x8_init( h->cpu, h->predict_8x8 );
  535.     x264_predict_4x4_init( h->cpu, h->predict_4x4 );
  536.     x264_pixel_init( h->cpu, &h->pixf );
  537.     x264_dct_init( h->cpu, &h->dctf );
  538.     x264_mc_init( h->cpu, h->mc );
  539.     /* create the vlc table (we could remove it from x264_t but it will need
  540.      * to introduce a x264_init() for global librarie) */
  541.     for( i = 0; i < 5; i++ )
  542.     {
  543.         /* max 2 step */
  544.         h->x264_coeff_token_lookup[i] = x264_vlc_table_lookup_new( x264_coeff_token[i], 17*4, 4 );
  545.     }
  546.     /* max 2 step */
  547.     h->x264_level_prefix_lookup = x264_vlc_table_lookup_new( x264_level_prefix, 16, 8 );
  548.     for( i = 0; i < 15; i++ )
  549.     {
  550.         /* max 1 step */
  551.         h->x264_total_zeros_lookup[i] = x264_vlc_table_lookup_new( x264_total_zeros[i], 16, 9 );
  552.     }
  553.     for( i = 0;i < 3; i++ )
  554.     {
  555.         /* max 1 step */
  556.         h->x264_total_zeros_dc_lookup[i] = x264_vlc_table_lookup_new( x264_total_zeros_dc[i], 4, 3 );
  557.     }
  558.     for( i = 0;i < 7; i++ )
  559.     {
  560.         /* max 2 step */
  561.         h->x264_run_before_lookup[i] = x264_vlc_table_lookup_new( x264_run_before[i], 15, 6 );
  562.     }
  563.     return h;
  564. }
  565. /****************************************************************************
  566.  * x264_decoder_decode: decode one nal unit
  567.  ****************************************************************************/
  568. int     x264_decoder_decode( x264_t *h,
  569.                              x264_picture_t **pp_pic, x264_nal_t *nal )
  570. {
  571.     int i_ret = 0;
  572.     bs_t bs;
  573.     /* no picture */
  574.     *pp_pic = NULL;
  575.     /* init bitstream reader */
  576.     bs_init( &bs, nal->p_payload, nal->i_payload );
  577.     switch( nal->i_type )
  578.     {
  579.         case NAL_SPS:
  580.             if( ( i_ret = x264_sps_read( &bs, h->sps_array ) ) < 0 )
  581.             {
  582.                 fprintf( stderr, "x264: x264_sps_read failedn" );
  583.             }
  584.             break;
  585.         case NAL_PPS:
  586.             if( ( i_ret = x264_pps_read( &bs, h->pps_array ) ) < 0 )
  587.             {
  588.                 fprintf( stderr, "x264: x264_pps_read failedn" );
  589.             }
  590.             break;
  591.         case NAL_SLICE_IDR:
  592.             fprintf( stderr, "x264: NAL_SLICE_IDRn" );
  593.             x264_slice_idr( h );
  594.         case NAL_SLICE:
  595.             if( ( i_ret = x264_slice_header_decode( h, &bs, nal ) ) < 0 )
  596.             {
  597.                 fprintf( stderr, "x264: x264_slice_header_decode failedn" );
  598.             }
  599.             if( h->sh.i_redundant_pic_cnt == 0 && i_ret == 0 )
  600.             {
  601.                 if( ( i_ret = x264_slice_data_decode( h, &bs ) ) < 0 )
  602.                 {
  603.                     fprintf( stderr, "x264: x264_slice_data_decode failedn" );
  604.                 }
  605.                 else
  606.                 {
  607.                     *pp_pic = h->picture;
  608.                 }
  609.             }
  610.             break;
  611.         case NAL_SLICE_DPA:
  612.         case NAL_SLICE_DPB:
  613.         case NAL_SLICE_DPC:
  614.             fprintf( stderr, "partitioned stream unsupportedn" );
  615.             i_ret = -1;
  616.             break;
  617.         case NAL_SEI:
  618.         default:
  619.             break;
  620.     }
  621.     /* restore CPU state (before using float again) */
  622.     x264_cpu_restore( h->cpu );
  623.     return i_ret;
  624. }
  625. /****************************************************************************
  626.  * x264_decoder_close:
  627.  ****************************************************************************/
  628. void    x264_decoder_close  ( x264_t *h )
  629. {
  630.     int i;
  631.     if( h->picture->i_width != 0 && h->picture->i_height != 0 )
  632.     {
  633.         for( i = 0; i < h->sps->i_num_ref_frames + 1; i++ )
  634.         {
  635.             x264_frame_delete( h->freference[i]);
  636.         }
  637.         x264_free( h->mb );
  638.     }
  639.     /* free vlc table */
  640.     for( i = 0; i < 5; i++ )
  641.     {
  642.         x264_vlc_table_lookup_delete( h->x264_coeff_token_lookup[i] );
  643.     }
  644.     x264_vlc_table_lookup_delete( h->x264_level_prefix_lookup );
  645.     for( i = 0; i < 15; i++ )
  646.     {
  647.         x264_vlc_table_lookup_delete( h->x264_total_zeros_lookup[i] );
  648.     }
  649.     for( i = 0;i < 3; i++ )
  650.     {
  651.         x264_vlc_table_lookup_delete( h->x264_total_zeros_dc_lookup[i] );
  652.     }
  653.     for( i = 0;i < 7; i++ )
  654.     {
  655.         x264_vlc_table_lookup_delete( h->x264_run_before_lookup[i] );
  656.     }
  657.     x264_free( h->picture );
  658.     x264_free( h );
  659. }