1 /******************************************************************************
2  *                                                                            *
3  * Copyright (C) 2018 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 #include "ixheaacd_type_def.h"
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include <string.h>
24 #include "ixheaacd_metadata_read.h"
25 
26 #define IA_MAX_CMDLINE_LENGTH 100
27 
28 void metadata_info_init(metadata_info *meta_info) {
29   meta_info = (metadata_info *)malloc(sizeof(metadata_info));
30 }
31 
32 void metadata_free(metadata_info *meta_info) {
33   if (meta_info->ia_mp4_stsz_size != NULL) free(meta_info->ia_mp4_stsz_size);
34   // free(meta_info);
35 }
36 
37 int ixheaacd_read_metadata_info(FILE *g_pf_metadata, metadata_info *meta_info) {
38   char cmd[IA_MAX_CMDLINE_LENGTH];
39 
40   WORD32 file_count = 0;
41   WORD32 i, j, k, l;
42   i = j = k = l = 0;
43   while (fgets((char *)cmd, IA_MAX_CMDLINE_LENGTH, g_pf_metadata)) {
44       if (!strncmp((pCHAR8)cmd, "-dec_info_init:", 15)) {
45         pCHAR8 pb_arg_val = (pCHAR8)(cmd + 15);
46         UWORD32 dec_info_init = atoi(pb_arg_val);
47         meta_info->dec_info_init = dec_info_init;
48         file_count++;
49       }
50       else if (!strncmp((pCHAR8)cmd, "-g_track_count:", 15)) {
51         pCHAR8 pb_arg_val = (pCHAR8)(cmd + 15);
52         UWORD32 g_track_count = atoi(pb_arg_val);
53         meta_info->g_track_count = g_track_count;
54         file_count++;
55       }
56 
57       else if (!strncmp((pCHAR8)cmd, "-movie_time_scale:", 18)) {
58         pCHAR8 pb_arg_val = (pCHAR8)(cmd + 18);
59         UWORD32 movie_time_scale = atoi(pb_arg_val);
60         meta_info->movie_time_scale = movie_time_scale;
61         file_count++;
62       }
63 
64       else if (!strncmp((pCHAR8)cmd, "-media_time_scale:", 18)) {
65         pCHAR8 pb_arg_val = (pCHAR8)(cmd + 18);
66         UWORD32 media_time_scale = atoi(pb_arg_val);
67         meta_info->media_time_scale = media_time_scale;
68         file_count++;
69       }
70 
71       else if (!strncmp((pCHAR8)cmd, "-ia_mp4_stsz_entries:", 21)) {
72         pCHAR8 pb_arg_val = (pCHAR8)(cmd + 21);
73         UWORD32 ia_mp4_stsz_entries = atoi(pb_arg_val);
74         meta_info->ia_mp4_stsz_entries = ia_mp4_stsz_entries;
75 
76         meta_info->ia_mp4_stsz_size =
77             (UWORD32 *)malloc(sizeof(int) * ia_mp4_stsz_entries);
78         file_count++;
79       }
80       /*
81       else if {
82         //printf("Wrong file order,Check file order");
83         //return -1;
84       }
85       */
86       else if (!strncmp((pCHAR8)cmd, "-playTimeInSamples:", 19)) {
87         pCHAR8 pb_arg_val = (pCHAR8)(cmd + 19);
88         UWORD32 playTimeInSamples = atoi(pb_arg_val);
89         meta_info->playTimeInSamples[i] = playTimeInSamples;
90         i++;
91       }
92 
93       else if (!strncmp((pCHAR8)cmd, "-startOffsetInSamples:", 22)) {
94         pCHAR8 pb_arg_val = (pCHAR8)(cmd + 22);
95         UWORD32 startOffsetInSamples = atoi(pb_arg_val);
96         meta_info->startOffsetInSamples[j] = startOffsetInSamples;
97         j++;
98       }
99 
100       else if (!strncmp((pCHAR8)cmd, "-useEditlist:", 13)) {
101         pCHAR8 pb_arg_val = (pCHAR8)(cmd + 13);
102         UWORD32 useEditlist = atoi(pb_arg_val);
103         meta_info->useEditlist[k] = useEditlist;
104         k++;
105       }
106 
107       else if (!strncmp((pCHAR8)cmd, "-ia_mp4_stsz_size:", 18)) {
108         pCHAR8 pb_arg_val = (pCHAR8)(cmd + 18);
109         UWORD32 ia_mp4_stsz_size = atoi(pb_arg_val);
110         meta_info->ia_mp4_stsz_size[l] = ia_mp4_stsz_size;
111         l++;
112       }
113 
114       else {
115         printf("Command not found");
116         return -1;
117       }
118   }
119 
120   for (; i < MAX_TRACKS_PER_LAYER; i++) {
121     meta_info->playTimeInSamples[i] = 0;
122   }
123 
124   for (; j < MAX_TRACKS_PER_LAYER; j++) {
125     meta_info->startOffsetInSamples[j] = 0;
126   }
127 
128   for (; k < MAX_TRACKS_PER_LAYER; k++) {
129     meta_info->useEditlist[k] = 0;
130   }
131 
132   return 0;
133 }
134 
135 int get_metadata_dec_info_init(metadata_info meta_info) {
136   return meta_info.dec_info_init;
137 }
138 
139 WORD32 get_metadata_dec_exec(metadata_info meta_info, int frame) {
140   return meta_info.ia_mp4_stsz_size[frame];
141 }
142 
143 int get_movie_time_scale(metadata_info meta_info) {
144   return meta_info.movie_time_scale;
145 }
146 
147 int get_media_time_scale(metadata_info meta_info) {
148   return meta_info.media_time_scale;
149 }
150 
151 int get_g_track_count(metadata_info meta_info) {
152   return meta_info.g_track_count;
153 }
154 
155 int get_use_edit_list(metadata_info meta_info) {
156   return meta_info.useEditlist[0];
157 }
158 
159 int get_start_offset_in_samples(metadata_info meta_info) {
160   return meta_info.startOffsetInSamples[0];
161 }
162 
163 int get_play_time_in_samples(metadata_info meta_info) {
164   return meta_info.playTimeInSamples[0];
165 }
166 /*
167 void update_start_offset_in_samples(metadata_info meta_info, int update)
168 {
169 
170         meta_info.startOffsetInSamples[0]=update;
171 }
172 */
173 
174 /*
175 void update_play_time_in_samples(metadata_info meta_info, int update)
176 {
177 
178         meta_info.playTimeInSamples[0]=update;
179 
180 }
181 */
182 
183 void memset_metadata(metadata_info meta_info) {
184   unsigned int i;
185 
186   for (i = 0; i < meta_info.g_track_count; i++) {
187     meta_info.startOffsetInSamples[i] = 0;
188     meta_info.startOffsetInSamples[i] = 0;
189     meta_info.playTimeInSamples[i] = 0;
190   }
191 
192   meta_info.g_track_count = 0;
193 }
194