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

Audio

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  * x264: h264 decoder
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 Laurent Aimar
  5.  * $Id: set.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 "set.h"
  29. /* return -1 if invalid, else the id */
  30. int x264_sps_read( bs_t *s, x264_sps_t sps_array[32] )
  31. {
  32.     x264_sps_t *sps;
  33.     int i_profile_idc;
  34.     int i_level_idc;
  35.     int b_constraint_set0;
  36.     int b_constraint_set1;
  37.     int b_constraint_set2;
  38.     int id;
  39.     i_profile_idc     = bs_read( s, 8 );
  40.     b_constraint_set0 = bs_read( s, 1 );
  41.     b_constraint_set1 = bs_read( s, 1 );
  42.     b_constraint_set2 = bs_read( s, 1 );
  43.     bs_skip( s, 5 );    /* reserved */
  44.     i_level_idc       = bs_read( s, 8 );
  45.     id = bs_read_ue( s );
  46.     if( bs_eof( s ) || id >= 32 )
  47.     {
  48.         /* the sps is invalid, no need to corrupt sps_array[0] */
  49.         return -1;
  50.     }
  51.     sps = &sps_array[id];
  52.     sps->i_id = id;
  53.     /* put pack parsed value */
  54.     sps->i_profile_idc     = i_profile_idc;
  55.     sps->i_level_idc       = i_level_idc;
  56.     sps->b_constraint_set0 = b_constraint_set0;
  57.     sps->b_constraint_set1 = b_constraint_set1;
  58.     sps->b_constraint_set2 = b_constraint_set2;
  59.     sps->i_log2_max_frame_num = bs_read_ue( s ) + 4;
  60.     sps->i_poc_type = bs_read_ue( s );
  61.     if( sps->i_poc_type == 0 )
  62.     {
  63.         sps->i_log2_max_poc_lsb = bs_read_ue( s ) + 4;
  64.     }
  65.     else if( sps->i_poc_type == 1 )
  66.     {
  67.         int i;
  68.         sps->b_delta_pic_order_always_zero = bs_read( s, 1 );
  69.         sps->i_offset_for_non_ref_pic = bs_read_se( s );
  70.         sps->i_offset_for_top_to_bottom_field = bs_read_se( s );
  71.         sps->i_num_ref_frames_in_poc_cycle = bs_read_ue( s );
  72.         if( sps->i_num_ref_frames_in_poc_cycle > 256 )
  73.         {
  74.             /* FIXME what to do */
  75.             sps->i_num_ref_frames_in_poc_cycle = 256;
  76.         }
  77.         for( i = 0; i < sps->i_num_ref_frames_in_poc_cycle; i++ )
  78.         {
  79.             sps->i_offset_for_ref_frame[i] = bs_read_se( s );
  80.         }
  81.     }
  82.     else if( sps->i_poc_type > 2 )
  83.     {
  84.         goto error;
  85.     }
  86.     sps->i_num_ref_frames = bs_read_ue( s );
  87.     sps->b_gaps_in_frame_num_value_allowed = bs_read( s, 1 );
  88.     sps->i_mb_width = bs_read_ue( s ) + 1;
  89.     sps->i_mb_height= bs_read_ue( s ) + 1;
  90.     sps->b_frame_mbs_only = bs_read( s, 1 );
  91.     if( !sps->b_frame_mbs_only )
  92.     {
  93.         sps->b_mb_adaptive_frame_field = bs_read( s, 1 );
  94.     }
  95.     else
  96.     {
  97.         sps->b_mb_adaptive_frame_field = 0;
  98.     }
  99.     sps->b_direct8x8_inference = bs_read( s, 1 );
  100.     sps->b_crop = bs_read( s, 1 );
  101.     if( sps->b_crop )
  102.     {
  103.         sps->crop.i_left  = bs_read_ue( s );
  104.         sps->crop.i_right = bs_read_ue( s );
  105.         sps->crop.i_top   = bs_read_ue( s );
  106.         sps->crop.i_bottom= bs_read_ue( s );
  107.     }
  108.     else
  109.     {
  110.         sps->crop.i_left  = 0;
  111.         sps->crop.i_right = 0;
  112.         sps->crop.i_top   = 0;
  113.         sps->crop.i_bottom= 0;
  114.     }
  115.     sps->b_vui = bs_read( s, 1 );
  116.     if( sps->b_vui )
  117.     {
  118.         /* FIXME */
  119.     }
  120.     else
  121.     {
  122.     }
  123.     if( bs_eof( s ) )
  124.     {
  125.         /* no rbsp trailing */
  126.         fprintf( stderr, "incomplete SPSn" );
  127.         goto error;
  128.     }
  129.     fprintf( stderr, "x264_sps_read: sps:0x%x profile:%d/%d poc:%d ref:%d %xx%d crop:%d-%d-%d-%dn",
  130.              sps->i_id,
  131.              sps->i_profile_idc, sps->i_level_idc,
  132.              sps->i_poc_type,
  133.              sps->i_num_ref_frames,
  134.              sps->i_mb_width, sps->i_mb_height,
  135.              sps->crop.i_left, sps->crop.i_right,
  136.              sps->crop.i_top, sps->crop.i_bottom );
  137.     return id;
  138. error:
  139.     /* invalidate this sps */
  140.     sps->i_id = -1;
  141.     return -1;
  142. }
  143. /* return -1 if invalid, else the id */
  144. int x264_pps_read( bs_t *s, x264_pps_t pps_array[256] )
  145. {
  146.     x264_pps_t *pps;
  147.     int id;
  148.     int i;
  149.     id = bs_read_ue( s );
  150.     if( bs_eof( s ) || id >= 256 )
  151.     {
  152.         fprintf( stderr, "id invalidn" );
  153.         return -1;
  154.     }
  155.     pps = &pps_array[id];
  156.     pps->i_id = id;
  157.     pps->i_sps_id = bs_read_ue( s );
  158.     if( pps->i_sps_id >= 32 )
  159.     {
  160.         goto error;
  161.     }
  162.     pps->b_cabac = bs_read( s, 1 );
  163.     pps->b_pic_order = bs_read( s, 1 );
  164.     pps->i_num_slice_groups = bs_read_ue( s ) + 1;
  165.     if( pps->i_num_slice_groups > 1 )
  166.     {
  167.         fprintf( stderr, "FMO unsupportedn " );
  168.         pps->i_slice_group_map_type  =bs_read_ue( s );
  169.         if( pps->i_slice_group_map_type == 0 )
  170.         {
  171.             for( i = 0; i < pps->i_num_slice_groups; i++ )
  172.             {
  173.                 pps->i_run_length[i] = bs_read_ue( s );
  174.             }
  175.         }
  176.         else if( pps->i_slice_group_map_type == 2 )
  177.         {
  178.             for( i = 0; i < pps->i_num_slice_groups; i++ )
  179.             {
  180.                 pps->i_top_left[i] = bs_read_ue( s );
  181.                 pps->i_bottom_right[i] = bs_read_ue( s );
  182.             }
  183.         }
  184.         else if( pps->i_slice_group_map_type == 3 ||
  185.                  pps->i_slice_group_map_type == 4 ||
  186.                  pps->i_slice_group_map_type == 5 )
  187.         {
  188.             pps->b_slice_group_change_direction = bs_read( s, 1 );
  189.             pps->i_slice_group_change_rate = bs_read_ue( s ) + 1;
  190.         }
  191.         else if( pps->i_slice_group_map_type == 6 )
  192.         {
  193.             pps->i_pic_size_in_map_units = bs_read_ue( s ) + 1;
  194.             for( i = 0; i < pps->i_pic_size_in_map_units; i++ )
  195.             {
  196.                /*  FIXME */
  197.                 /* pps->i_slice_group_id = bs_read( s, ceil( log2( pps->i_pic_size_in_map_units +1 ) ) ); */
  198.             }
  199.         }
  200.     }
  201.     pps->i_num_ref_idx_l0_active = bs_read_ue( s ) + 1;
  202.     pps->i_num_ref_idx_l1_active = bs_read_ue( s ) + 1;
  203.     pps->b_weighted_pred = bs_read( s, 1 );
  204.     pps->b_weighted_bipred = bs_read( s, 2 );
  205.     pps->i_pic_init_qp = bs_read_se( s ) + 26;
  206.     pps->i_pic_init_qs = bs_read_se( s ) + 26;
  207.     pps->i_chroma_qp_index_offset = bs_read_se( s );
  208.     pps->b_deblocking_filter_control = bs_read( s, 1 );
  209.     pps->b_constrained_intra_pred = bs_read( s, 1 );
  210.     pps->b_redundant_pic_cnt = bs_read( s, 1 );
  211.     if( bs_eof( s ) )
  212.     {
  213.         /* no rbsp trailing */
  214.         fprintf( stderr, "incomplete PPSn" );
  215.         goto error;
  216.     }
  217.     fprintf( stderr, "x264_sps_read: pps:0x%x sps:0x%x %s slice_groups=%d ref0:%d ref1:%d QP:%d QS:%d QC=%d DFC:%d CIP:%d RPC:%dn",
  218.              pps->i_id, pps->i_sps_id,
  219.              pps->b_cabac ? "CABAC" : "CAVLC",
  220.              pps->i_num_slice_groups,
  221.              pps->i_num_ref_idx_l0_active,
  222.              pps->i_num_ref_idx_l1_active,
  223.              pps->i_pic_init_qp, pps->i_pic_init_qs, pps->i_chroma_qp_index_offset,
  224.              pps->b_deblocking_filter_control,
  225.              pps->b_constrained_intra_pred,
  226.              pps->b_redundant_pic_cnt );
  227.     return id;
  228. error:
  229.     pps->i_id = -1;
  230.     return -1;
  231. }