C++程序  |  194行  |  5.62 KB

/******************************************************************************
 *                                                                            *
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
#include "ixheaacd_type_def.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "ixheaacd_metadata_read.h"

#define IA_MAX_CMDLINE_LENGTH 100

void metadata_info_init(metadata_info *meta_info) {
  meta_info = (metadata_info *)malloc(sizeof(metadata_info));
}

void metadata_free(metadata_info *meta_info) {
  if (meta_info->ia_mp4_stsz_size != NULL) free(meta_info->ia_mp4_stsz_size);
  // free(meta_info);
}

int ixheaacd_read_metadata_info(FILE *g_pf_metadata, metadata_info *meta_info) {
  char cmd[IA_MAX_CMDLINE_LENGTH];

  WORD32 file_count = 0;
  WORD32 i, j, k, l;
  i = j = k = l = 0;
  while (fgets((char *)cmd, IA_MAX_CMDLINE_LENGTH, g_pf_metadata)) {
      if (!strncmp((pCHAR8)cmd, "-dec_info_init:", 15)) {
        pCHAR8 pb_arg_val = (pCHAR8)(cmd + 15);
        UWORD32 dec_info_init = atoi(pb_arg_val);
        meta_info->dec_info_init = dec_info_init;
        file_count++;
      }
      else if (!strncmp((pCHAR8)cmd, "-g_track_count:", 15)) {
        pCHAR8 pb_arg_val = (pCHAR8)(cmd + 15);
        UWORD32 g_track_count = atoi(pb_arg_val);
        meta_info->g_track_count = g_track_count;
        file_count++;
      }

      else if (!strncmp((pCHAR8)cmd, "-movie_time_scale:", 18)) {
        pCHAR8 pb_arg_val = (pCHAR8)(cmd + 18);
        UWORD32 movie_time_scale = atoi(pb_arg_val);
        meta_info->movie_time_scale = movie_time_scale;
        file_count++;
      }

      else if (!strncmp((pCHAR8)cmd, "-media_time_scale:", 18)) {
        pCHAR8 pb_arg_val = (pCHAR8)(cmd + 18);
        UWORD32 media_time_scale = atoi(pb_arg_val);
        meta_info->media_time_scale = media_time_scale;
        file_count++;
      }

      else if (!strncmp((pCHAR8)cmd, "-ia_mp4_stsz_entries:", 21)) {
        pCHAR8 pb_arg_val = (pCHAR8)(cmd + 21);
        UWORD32 ia_mp4_stsz_entries = atoi(pb_arg_val);
        meta_info->ia_mp4_stsz_entries = ia_mp4_stsz_entries;

        meta_info->ia_mp4_stsz_size =
            (UWORD32 *)malloc(sizeof(int) * ia_mp4_stsz_entries);
        file_count++;
      }
      /*
      else if {
        //printf("Wrong file order,Check file order");
        //return -1;
      }
      */
      else if (!strncmp((pCHAR8)cmd, "-playTimeInSamples:", 19)) {
        pCHAR8 pb_arg_val = (pCHAR8)(cmd + 19);
        UWORD32 playTimeInSamples = atoi(pb_arg_val);
        meta_info->playTimeInSamples[i] = playTimeInSamples;
        i++;
      }

      else if (!strncmp((pCHAR8)cmd, "-startOffsetInSamples:", 22)) {
        pCHAR8 pb_arg_val = (pCHAR8)(cmd + 22);
        UWORD32 startOffsetInSamples = atoi(pb_arg_val);
        meta_info->startOffsetInSamples[j] = startOffsetInSamples;
        j++;
      }

      else if (!strncmp((pCHAR8)cmd, "-useEditlist:", 13)) {
        pCHAR8 pb_arg_val = (pCHAR8)(cmd + 13);
        UWORD32 useEditlist = atoi(pb_arg_val);
        meta_info->useEditlist[k] = useEditlist;
        k++;
      }

      else if (!strncmp((pCHAR8)cmd, "-ia_mp4_stsz_size:", 18)) {
        pCHAR8 pb_arg_val = (pCHAR8)(cmd + 18);
        UWORD32 ia_mp4_stsz_size = atoi(pb_arg_val);
        meta_info->ia_mp4_stsz_size[l] = ia_mp4_stsz_size;
        l++;
      }

      else {
        printf("Command not found");
        return -1;
      }
  }

  for (; i < MAX_TRACKS_PER_LAYER; i++) {
    meta_info->playTimeInSamples[i] = 0;
  }

  for (; j < MAX_TRACKS_PER_LAYER; j++) {
    meta_info->startOffsetInSamples[j] = 0;
  }

  for (; k < MAX_TRACKS_PER_LAYER; k++) {
    meta_info->useEditlist[k] = 0;
  }

  return 0;
}

int get_metadata_dec_info_init(metadata_info meta_info) {
  return meta_info.dec_info_init;
}

WORD32 get_metadata_dec_exec(metadata_info meta_info, int frame) {
  return meta_info.ia_mp4_stsz_size[frame];
}

int get_movie_time_scale(metadata_info meta_info) {
  return meta_info.movie_time_scale;
}

int get_media_time_scale(metadata_info meta_info) {
  return meta_info.media_time_scale;
}

int get_g_track_count(metadata_info meta_info) {
  return meta_info.g_track_count;
}

int get_use_edit_list(metadata_info meta_info) {
  return meta_info.useEditlist[0];
}

int get_start_offset_in_samples(metadata_info meta_info) {
  return meta_info.startOffsetInSamples[0];
}

int get_play_time_in_samples(metadata_info meta_info) {
  return meta_info.playTimeInSamples[0];
}
/*
void update_start_offset_in_samples(metadata_info meta_info, int update)
{

        meta_info.startOffsetInSamples[0]=update;
}
*/

/*
void update_play_time_in_samples(metadata_info meta_info, int update)
{

        meta_info.playTimeInSamples[0]=update;

}
*/

void memset_metadata(metadata_info meta_info) {
  unsigned int i;

  for (i = 0; i < meta_info.g_track_count; i++) {
    meta_info.startOffsetInSamples[i] = 0;
    meta_info.startOffsetInSamples[i] = 0;
    meta_info.playTimeInSamples[i] = 0;
  }

  meta_info.g_track_count = 0;
}