Changeset 387 for libmpc/trunk/mpcchap/mpcchap.c
- Timestamp:
- 04/01/08 23:04:22 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libmpc/trunk/mpcchap/mpcchap.c
r384 r387 38 38 #include "iniparser.h" 39 39 40 // #include <sys/types.h>41 40 #include <sys/stat.h> 42 // #include <unistd.h>43 41 44 42 // tags.c … … 57 55 static void usage(const char *exename) 58 56 { 59 printf("Usage: %s <infile.mpc> <chapterfile.ini>\n", exename); 60 } 61 62 int main(int argc, char **argv) 63 { 64 mpc_reader reader; 65 mpc_demux* demux; 66 mpc_streaminfo si; 67 char * mpc_file, * chap_file; 57 printf( 58 "Usage: %s <infile.mpc> <chapterfile.ini>\n" 59 " if chapterfile.ini exists, chapter tags in infile.mpc will be\n" 60 " replaced by those from chapterfile.ini, else chapters will be\n" 61 " dumped to chapterfile.ini\n" 62 " chapterfile.ini is something like :\n" 63 " [chapter_start_sample]\n" 64 " SomeKey=Some Value\n" 65 " SomeOtherKey=Some Other Value\n" 66 " [other_chapter_start]\n" 67 " YouKnowWhatKey=I think you start to understand ...\n" 68 , exename); 69 } 70 71 mpc_status add_chaps(char * mpc_file, char * chap_file, mpc_demux * demux, mpc_streaminfo * si) 72 { 73 struct stat stbuf; 68 74 FILE * in_file; 69 mpc_status err; 70 int i; 71 72 if (argc != 3) 73 usage(argv[0]); 74 75 mpc_file = argv[1]; 76 chap_file = argv[2]; 77 78 err = mpc_reader_init_stdio(&reader, argv[1]); 79 if(err < 0) return !MPC_STATUS_OK; 80 81 demux = mpc_demux_init(&reader); 82 if(!demux) return !MPC_STATUS_OK; 83 mpc_demux_get_info(demux, &si); 84 85 if (si.stream_version < 8) { 86 fprintf(stderr, "this file cannot be edited, please convert it first to sv8 using mpc2sv8\n"); 87 exit(!MPC_STATUS_OK); 88 } 89 90 int chap_nb = mpc_demux_chap_nb(demux); 91 for (i = 0; i < chap_nb; i++) { 92 printf("chap %i : %i\n", i+1, mpc_demux_chap(demux, i, 0, 0)); 93 } 94 int chap_pos = (demux->chap_pos >> 3) + si.header_position; 95 int end_pos = mpc_demux_pos(demux) >> 3; 96 int chap_size = end_pos - chap_pos; 97 printf("chap-size : %i, end_pos : %x\n", chap_size, end_pos); 98 struct stat stbuf; 99 stat(argv[1], &stbuf); 75 int chap_pos, end_pos, chap_size, i; 76 77 chap_pos = (demux->chap_pos >> 3) + si->header_position; 78 end_pos = mpc_demux_pos(demux) >> 3; 79 chap_size = end_pos - chap_pos; 80 81 stat(mpc_file, &stbuf); 100 82 char * tmp_buff = malloc(stbuf.st_size - chap_pos - chap_size); 101 83 in_file = fopen( mpc_file, "r+b" ); … … 103 85 fread(tmp_buff, 1, stbuf.st_size - chap_pos - chap_size, in_file); 104 86 fseek(in_file, chap_pos, SEEK_SET); 105 87 106 88 dictionary * dict = iniparser_load(chap_file); 107 89 … … 112 94 char * chap_sec = iniparser_getsecname(dict, i); 113 95 mpc_int64_t chap_pos = atoll(chap_sec); 96 if (chap_pos > si->samples - si->beg_silence) 97 fprintf(stderr, "warning : chapter %i starts @ %lli after the end of the stream (%lli)\n", i + 1, chap_pos, si->samples - si->beg_silence); 114 98 nitem = iniparser_getnkey(dict, i); 115 99 for (j = 0; j < nitem; j++) { … … 131 115 FinalizeTags(in_file, TAG_VERSION, TAG_NO_FOOTER | TAG_NO_PREAMBLE); 132 116 } 133 117 134 118 fwrite(tmp_buff, 1, stbuf.st_size - chap_pos - chap_size, in_file); 135 119 ftruncate(fileno(in_file), ftell(in_file)); 120 136 121 fclose(in_file); 137 122 free(tmp_buff); 138 123 iniparser_freedict(dict); 139 return 0; 140 } 124 125 return MPC_STATUS_OK; 126 } 127 128 mpc_status dump_chaps(mpc_demux * demux, char * chap_file, int chap_nb) 129 { 130 int i; 131 unsigned int tag_size; 132 FILE * out_file; 133 char * tag; 134 135 if (chap_nb <= 0) 136 return MPC_STATUS_OK; 137 138 out_file = fopen(chap_file, "wb"); 139 if (out_file == 0) 140 return !MPC_STATUS_OK; 141 142 for (i = 0; i < chap_nb; i++) { 143 int item_count, j; 144 fprintf(out_file, "[%lli]\n", mpc_demux_chap(demux, i, &tag, &tag_size)); 145 item_count = tag[8] | (tag[9] << 8) | (tag[10] << 16) | (tag[11] << 24); 146 tag += 24; 147 for( j = 0; j < item_count; j++){ 148 int key_len = strlen(tag + 8); 149 int value_len = tag[0] | (tag[1] << 8) | (tag[2] << 16) | (tag[3] << 24); 150 fprintf(out_file, "%s=%.*s\n", tag + 8, value_len, tag + 9 + key_len); 151 tag += 9 + key_len + value_len; 152 } 153 fprintf(out_file, "\n"); 154 } 155 156 fclose(out_file); 157 158 return MPC_STATUS_OK; 159 } 160 161 int main(int argc, char **argv) 162 { 163 mpc_reader reader; 164 mpc_demux* demux; 165 mpc_streaminfo si; 166 char * mpc_file, * chap_file; 167 mpc_status err; 168 FILE * test_file; 169 170 if (argc != 3) 171 usage(argv[0]); 172 173 mpc_file = argv[1]; 174 chap_file = argv[2]; 175 176 err = mpc_reader_init_stdio(&reader, mpc_file); 177 if(err < 0) return !MPC_STATUS_OK; 178 179 demux = mpc_demux_init(&reader); 180 if(!demux) return !MPC_STATUS_OK; 181 mpc_demux_get_info(demux, &si); 182 183 if (si.stream_version < 8) { 184 fprintf(stderr, "this file cannot be edited, please convert it first to sv8 using mpc2sv8\n"); 185 exit(!MPC_STATUS_OK); 186 } 187 188 int chap_nb = mpc_demux_chap_nb(demux); 189 190 test_file = fopen(chap_file, "rb" ); 191 if (test_file == 0) { 192 err = dump_chaps(demux, chap_file, chap_nb); 193 } else { 194 fclose(test_file); 195 err = add_chaps(mpc_file, chap_file, demux, &si); 196 } 197 198 mpc_demux_exit(demux); 199 mpc_reader_exit_stdio(&reader); 200 return err; 201 }
Note: See TracChangeset
for help on using the changeset viewer.