00001 #include "funcprotos.h"
00002 #include "quicktime.h"
00003 #include <string.h>
00004
00005 #define DEFAULT_INFO "Made with Quicktime for Linux"
00006 static unsigned char cpy_tag[] = {0xa9, 'c', 'p', 'y'};
00007 static unsigned char nam_tag[] = {0xa9, 'n', 'a', 'm'};
00008 static unsigned char inf_tag[] = {0xa9, 'i', 'n', 'f'};
00009 static unsigned char req_tag[] = {0xa9, 'r', 'e', 'q'};
00010 static unsigned char enc_tag[] = {0xa9, 'e', 'n', 'c'};
00011
00012 int quicktime_udta_init(quicktime_udta_t *udta)
00013 {
00014 udta->copyright = 0;
00015 udta->copyright_len = 0;
00016 udta->name = 0;
00017 udta->name_len = 0;
00018 udta->require = 0;
00019 udta->require_len = 0;
00020 udta->encoder = 0;
00021 udta->encoder_len = 0;
00022
00023 udta->info = malloc(strlen(DEFAULT_INFO) + 1);
00024 udta->info_len = strlen(DEFAULT_INFO);
00025 sprintf(udta->info, DEFAULT_INFO);
00026 return 0;
00027 }
00028
00029 int quicktime_udta_delete(quicktime_udta_t *udta)
00030 {
00031 if(udta->copyright_len)
00032 {
00033 free(udta->copyright);
00034 }
00035 if(udta->name_len)
00036 {
00037 free(udta->name);
00038 }
00039 if(udta->info_len)
00040 {
00041 free(udta->info);
00042 }
00043 if(udta->require_len)
00044 {
00045 free(udta->require);
00046 }
00047 if(udta->encoder_len)
00048 {
00049 free(udta->encoder);
00050 }
00051
00052 return 0;
00053 }
00054
00055 void quicktime_udta_dump(quicktime_udta_t *udta)
00056 {
00057 printf(" user data (udta)\n");
00058 if(udta->copyright_len) printf(" copyright -> %s\n", udta->copyright);
00059 if(udta->name_len) printf(" name -> %s\n", udta->name);
00060 if(udta->info_len) printf(" info -> %s\n", udta->info);
00061 if(udta->require_len) printf(" require -> %s\n", udta->require);
00062 if(udta->encoder_len) printf(" encoder -> %s\n", udta->encoder);
00063 }
00064
00065 int quicktime_read_udta(quicktime_t *file, quicktime_udta_t *udta, quicktime_atom_t *udta_atom)
00066 {
00067 quicktime_atom_t leaf_atom;
00068 int result = 0;
00069
00070 do
00071 {
00072 quicktime_atom_read_header(file, &leaf_atom);
00073
00074
00075 if(quicktime_atom_is(&leaf_atom, cpy_tag))
00076 {
00077 result += quicktime_read_udta_string(file, &(udta->copyright), &(udta->copyright_len));
00078 }
00079 else
00080 if(quicktime_atom_is(&leaf_atom, nam_tag))
00081 {
00082 result += quicktime_read_udta_string(file, &(udta->name), &(udta->name_len));
00083 }
00084 else
00085 if(quicktime_atom_is(&leaf_atom, inf_tag))
00086 {
00087 result += quicktime_read_udta_string(file, &(udta->info), &(udta->info_len));
00088 }
00089 else
00090 if(quicktime_atom_is(&leaf_atom, req_tag))
00091 {
00092 result += quicktime_read_udta_string(file, &(udta->require), &(udta->require_len));
00093 }
00094 else
00095 if(quicktime_atom_is(&leaf_atom, enc_tag))
00096 {
00097 result += quicktime_read_udta_string(file, &(udta->encoder), &(udta->encoder_len));
00098 }
00099 else
00100 {
00101 quicktime_atom_skip(file, &leaf_atom);
00102 }
00103 }while(quicktime_position(file) < udta_atom->end);
00104
00105
00106 return result;
00107 }
00108
00109 void quicktime_write_udta(quicktime_t *file, quicktime_udta_t *udta)
00110 {
00111 quicktime_atom_t atom, subatom;
00112 quicktime_atom_write_header(file, &atom, "udta");
00113
00114 if(udta->copyright_len)
00115 {
00116 quicktime_atom_write_header(file, &subatom, cpy_tag);
00117 quicktime_write_udta_string(file, udta->copyright, udta->copyright_len);
00118 quicktime_atom_write_footer(file, &subatom);
00119 }
00120
00121 if(udta->name_len)
00122 {
00123 quicktime_atom_write_header(file, &subatom, nam_tag);
00124 quicktime_write_udta_string(file, udta->name, udta->name_len);
00125 quicktime_atom_write_footer(file, &subatom);
00126 }
00127
00128 if(udta->info_len)
00129 {
00130 quicktime_atom_write_header(file, &subatom, inf_tag);
00131 quicktime_write_udta_string(file, udta->info, udta->info_len);
00132 quicktime_atom_write_footer(file, &subatom);
00133 }
00134
00135 if(udta->require_len)
00136 {
00137 quicktime_atom_write_header(file, &subatom, req_tag);
00138 quicktime_write_udta_string(file, udta->require, udta->require_len);
00139 quicktime_atom_write_footer(file, &subatom);
00140 }
00141
00142 if(udta->encoder_len)
00143 {
00144 quicktime_atom_write_header(file, &subatom, enc_tag);
00145 quicktime_write_udta_string(file, udta->encoder, udta->encoder_len);
00146 quicktime_atom_write_footer(file, &subatom);
00147 }
00148
00149 quicktime_atom_write_footer(file, &atom);
00150 }
00151
00152 int quicktime_read_udta_string(quicktime_t *file, char **string, int *size)
00153 {
00154 int result;
00155
00156 if(*size) free(*string);
00157 *size = quicktime_read_int16(file);
00158 quicktime_read_int16(file);
00159 *string = malloc(*size + 1);
00160 result = quicktime_read_data(file, *string, *size);
00161 (*string)[*size] = 0;
00162 return !result;
00163 }
00164
00165 int quicktime_write_udta_string(quicktime_t *file, char *string, int size)
00166 {
00167 int new_size = strlen(string);
00168 int result;
00169
00170 quicktime_write_int16(file, new_size);
00171 quicktime_write_int16(file, 0);
00172 result = quicktime_write_data(file, string, new_size);
00173 return !result;
00174 }
00175
00176 int quicktime_set_udta_string(char **string, int *size, char *new_string)
00177 {
00178 if(*size) free(*string);
00179 *size = strlen(new_string) + 1;
00180 *string = malloc(*size);
00181 strcpy(*string, new_string);
00182 return 0;
00183 }