コード例 #1
0
ファイル: fmo.c プロジェクト: Cheng-Hsu/JM
/*!
 ************************************************************************
 * \brief
 *    Generates p_Img->MapUnitToSliceGroupMap 
 *
 * \param p_Img
 *    Image Parameter to be used for map generation
 * \param pps
 *    Picture Parameter set to be used for map generation
 *
 ************************************************************************
 */
static int FmoGenerateMapUnitToSliceGroupMap (ImageParameters * p_Img, pic_parameter_set_rbsp_t * pps)
{
  p_Img->PicSizeInMapUnits = p_Img->PicHeightInMapUnits * p_Img->PicWidthInMbs;


  if (pps->slice_group_map_type == 6)
  {
    if ((pps->pic_size_in_map_units_minus1+1) != p_Img->PicSizeInMapUnits)
    {
      error ("wrong pps->pic_size_in_map_units_minus1 for used SPS and FMO type 6", 500);
    }
  }

  // allocate memory for p_Img->MapUnitToSliceGroupMap 
  if (p_Img->MapUnitToSliceGroupMap)
    free (p_Img->MapUnitToSliceGroupMap);

  if ((p_Img->MapUnitToSliceGroupMap = malloc ((p_Img->PicSizeInMapUnits) * sizeof (byte))) == NULL)
  {
    printf ("cannot allocated %d bytes for p_Img->MapUnitToSliceGroupMap , exit\n", (int) ( p_Img->PicSizeInMapUnits * sizeof (byte)));
    exit (-1);
  }

  if (pps->num_slice_groups_minus1 == 0)    // only one slice group
  {
    memset (p_Img->MapUnitToSliceGroupMap , 0,  p_Img->PicSizeInMapUnits * sizeof (byte));
    return 0;
  }

  switch (pps->slice_group_map_type)
  {
  case 0:
    FmoGenerateType0MapUnitMap (p_Img, pps);
    break;
  case 1:
    FmoGenerateType1MapUnitMap (p_Img, pps);
    break;
  case 2:
    FmoGenerateType2MapUnitMap (p_Img, pps);
    break;
  case 3:
    FmoGenerateType3MapUnitMap (p_Img, pps);
    break;
  case 4:
    FmoGenerateType4MapUnitMap (p_Img, pps);
    break;
  case 5:
    FmoGenerateType5MapUnitMap (p_Img, pps);
    break;
  case 6:
    FmoGenerateType6MapUnitMap (p_Img, pps);
    break;
  default:
    printf ("Illegal slice_group_map_type %d , exit \n", pps->slice_group_map_type);
    exit (-1);
  }
  return 0;
}
コード例 #2
0
ファイル: fmo.cpp プロジェクト: freemindhack/h264android
/* see subclause 8.2.2 Decoding process for macroblock to slice group map */
AVCStatus FMOInit(AVCCommonObj *video)
{
    AVCPicParamSet *currPPS = video->currPicParams;
    int *MbToSliceGroupMap = video->MbToSliceGroupMap;
    int PicSizeInMapUnits = video->PicSizeInMapUnits;
    int PicWidthInMbs = video->PicWidthInMbs;

    if (currPPS->num_slice_groups_minus1 == 0)
    {
        oscl_memset(video->MbToSliceGroupMap, 0, video->PicSizeInMapUnits*sizeof(uint));
    }
    else
    {
        switch (currPPS->slice_group_map_type)
        {
            case 0:
                FmoGenerateType0MapUnitMap(MbToSliceGroupMap, currPPS->run_length_minus1, currPPS->num_slice_groups_minus1, PicSizeInMapUnits);
                break;
            case 1:
                FmoGenerateType1MapUnitMap(MbToSliceGroupMap, PicWidthInMbs, currPPS->num_slice_groups_minus1, PicSizeInMapUnits);
                break;
            case 2:
                FmoGenerateType2MapUnitMap(currPPS, MbToSliceGroupMap, PicWidthInMbs, currPPS->num_slice_groups_minus1, PicSizeInMapUnits);
                break;
            case 3:
                FmoGenerateType3MapUnitMap(video, currPPS, MbToSliceGroupMap, PicWidthInMbs);
                break;
            case 4:
                FmoGenerateType4MapUnitMap(MbToSliceGroupMap, video->MapUnitsInSliceGroup0, currPPS->slice_group_change_direction_flag, PicSizeInMapUnits);
                break;
            case 5:
                FmoGenerateType5MapUnitMap(MbToSliceGroupMap, video, currPPS->slice_group_change_direction_flag, PicSizeInMapUnits);
                break;
            case 6:
                FmoGenerateType6MapUnitMap(MbToSliceGroupMap, (int*)currPPS->slice_group_id, PicSizeInMapUnits);
                break;
            default:
                return AVC_FAIL; /* out of range, shouldn't come this far */
        }
    }

    return AVC_SUCCESS;
}
コード例 #3
0
ファイル: fmo.c プロジェクト: tanxuan231/jm19.0_key
/*!
 ************************************************************************
 * \brief
 *    Generates p_Vid->MapUnitToSliceGroupMap
 *    Has to be called every time a new Picture Parameter Set is used
 *
 * \param p_Vid
 *      video encoding parameters for current picture
 *
 ************************************************************************
 */
static int FmoGenerateMapUnitToSliceGroupMap (VideoParameters *p_Vid, Slice *currSlice)
{
    seq_parameter_set_rbsp_t* sps = p_Vid->active_sps;
    pic_parameter_set_rbsp_t* pps = p_Vid->active_pps;

    unsigned int NumSliceGroupMapUnits;

    NumSliceGroupMapUnits = (sps->pic_height_in_map_units_minus1+1)* (sps->pic_width_in_mbs_minus1+1);

    if (pps->slice_group_map_type == 6)
    {
        if ((pps->pic_size_in_map_units_minus1 + 1) != NumSliceGroupMapUnits)
        {
            error ("wrong pps->pic_size_in_map_units_minus1 for used SPS and FMO type 6", 500);
        }
    }

    // allocate memory for p_Vid->MapUnitToSliceGroupMap
    if (p_Vid->MapUnitToSliceGroupMap)
        free (p_Vid->MapUnitToSliceGroupMap);
    if ((p_Vid->MapUnitToSliceGroupMap = malloc ((NumSliceGroupMapUnits) * sizeof (int))) == NULL)
    {
        printf ("cannot allocated %d bytes for p_Vid->MapUnitToSliceGroupMap, exit\n", (int) ( (pps->pic_size_in_map_units_minus1+1) * sizeof (int)));
        exit (-1);
    }

    if (pps->num_slice_groups_minus1 == 0)    // only one slice group
    {
        fast_memset (p_Vid->MapUnitToSliceGroupMap, 0, NumSliceGroupMapUnits * sizeof (int));
        return 0;
    }

    switch (pps->slice_group_map_type)
    {
    case 0:
        FmoGenerateType0MapUnitMap (p_Vid, NumSliceGroupMapUnits);
        break;
    case 1:
        FmoGenerateType1MapUnitMap (p_Vid, NumSliceGroupMapUnits);
        break;
    case 2:
        FmoGenerateType2MapUnitMap (p_Vid, NumSliceGroupMapUnits);
        break;
    case 3:
        FmoGenerateType3MapUnitMap (p_Vid, NumSliceGroupMapUnits, currSlice);
        break;
    case 4:
        FmoGenerateType4MapUnitMap (p_Vid, NumSliceGroupMapUnits, currSlice);
        break;
    case 5:
        FmoGenerateType5MapUnitMap (p_Vid, NumSliceGroupMapUnits, currSlice);
        break;
    case 6:
        FmoGenerateType6MapUnitMap (p_Vid, NumSliceGroupMapUnits);
        break;
    default:
        printf ("Illegal slice_group_map_type %d , exit \n", (int) pps->slice_group_map_type);
        exit (-1);
    }
    return 0;
}