static void test_message_header_parser_partial(void) { struct message_header_parser_ctx *parser; struct message_header_line *hdr; struct istream *input; unsigned int i, max = (strlen(test1_msg)-TEST1_MSG_BODY_LEN)*2; string_t *str; int ret; test_begin("message header parser partial"); input = test_istream_create(test1_msg); test_istream_set_allow_eof(input, FALSE); str = t_str_new(max); parser = message_parse_header_init(input, NULL, 0); for (i = 0; i <= max; i++) { test_istream_set_size(input, i/2); while ((ret = message_parse_header_next(parser, &hdr)) > 0) hdr_write(str, hdr); test_assert((ret == 0 && i < max) || (ret < 0 && i == max)); } message_parse_header_deinit(&parser); str_append(str, " body"); test_assert(strcmp(str_c(str), test1_msg) == 0); i_stream_unref(&input); test_end(); }
int main(int argc, char *argv[]) { struct common_struct rtf; struct AVIStreamHeader ash, vsh; avi_t *avifile; int err, fd, id = 0, track_num = 0, n, ch, debug = TC_FALSE; int brate = 0, val1 = 0, val2 = 1, a_rate, a_chan, a_bits; long ah_off = 0, af_off = 0, vh_off = 0, vf_off = 0; char codec[5], *str = NULL, *filename = NULL; uint32_t change = CHANGE_NOTHING; ac_init(AC_ALL); if (argc==1) usage(EXIT_FAILURE); while ((ch = getopt(argc, argv, "df:i:N:F:vb:e:a:?h")) != -1) { switch (ch) { case 'N': VALIDATE_OPTION; id = strtol(optarg, NULL, 16); if (id < 0) { tc_log_error(EXE, "invalid parameter set for option -N"); } else { change |= CHANGE_AUDIO_FMT; } break; case 'a': VALIDATE_OPTION; track_num = atoi(optarg); if (track_num < 0) usage(EXIT_FAILURE); break; case 'f': VALIDATE_OPTION; n = sscanf(optarg,"%d,%d", &val1, &val2); if (n != 2 || val1 < 0 || val2 < 0) { tc_log_error(EXE, "invalid parameter set for option -f"); } else { change |= CHANGE_VIDEO_FPS; } break; case 'F': VALIDATE_OPTION; str = optarg; if(strlen(str) > 4 || strlen(str) == 0) { tc_log_error(EXE, "invalid parameter set for option -F"); } else { change |= CHANGE_VIDEO_FOURCC; } break; case 'i': VALIDATE_OPTION; filename = optarg; break; case 'b': VALIDATE_OPTION; brate = atoi(optarg); change |= CHANGE_AUDIO_BR; break; case 'v': version(); exit(0); case 'e': VALIDATE_OPTION; n = sscanf(optarg,"%d,%d,%d", &a_rate, &a_bits, &a_chan); switch (n) { case 3: change |= CHANGE_AUDIO_RATE; case 2: change |= CHANGE_AUDIO_BITS; case 1: change |= CHANGE_AUDIO_CHANS; break; default: tc_log_error(EXE, "invalid parameter set for option -e"); } break; case 'd': debug = TC_TRUE; break; case 'h': usage(EXIT_SUCCESS); default: usage(EXIT_FAILURE); } } if (!filename) usage(EXIT_FAILURE); tc_log_info(EXE, "scanning AVI-file %s for header information", filename); avifile = AVI_open_input_file(filename, 1); if (!avifile) { AVI_print_error("AVI open"); exit(1); } AVI_info(avifile); if (AVI_set_audio_track(avifile, track_num) < 0) { tc_log_error(EXE, "invalid audio track"); } ah_off = AVI_audio_codech_offset(avifile); af_off = AVI_audio_codecf_offset(avifile); vh_off = AVI_video_codech_offset(avifile); vf_off = AVI_video_codecf_offset(avifile); if (debug) { tc_log_info(EXE, "offsets: ah=%li af=%li vh=%li vf=%li", ah_off, af_off, vh_off, vf_off); } AVI_close(avifile); fd = open(filename, O_RDWR); if (fd < 0) { perror("open"); exit(1); } lseek(fd, vh_off, SEEK_SET); hdr_read("video codec [h]", fd, codec, 4); codec[4] = 0; lseek(fd, vf_off, SEEK_SET); hdr_read("video codec [f]", fd, codec, 4); codec[4] = 0; if (change & CHANGE_VIDEO_FPS) { lseek(fd, vh_off-4, SEEK_SET); hdr_read("video fps", fd, &vsh, sizeof(vsh)); vsh.dwRate = (long)val1; vsh.dwScale = (long)val2; lseek(fd, vh_off-4, SEEK_SET); hdr_write("video fps", fd, &vsh, sizeof(vsh)); } if (change & CHANGE_VIDEO_FOURCC) { lseek(fd,vh_off,SEEK_SET); if (strncmp(str,"RGB",3) == 0) { hdr_write("video 4cc", fd, codec, 4); } else { hdr_write("video 4cc", fd, str, 4); } lseek(fd,vf_off,SEEK_SET); if(strncmp(str,"RGB",3)==0) { memset(codec, 0, 4); hdr_write("video 4cc", fd, codec, 4); } else { hdr_write("video 4cc", fd, str, 4); } } if (NEED_AUDIO_CHANGE(change)) { lseek(fd, ah_off, SEEK_SET); hdr_read("audio header [h]", fd, &ash, sizeof(ash)); lseek(fd, af_off, SEEK_SET); hdr_read("audio header [f]", fd, &rtf, sizeof(rtf)); if (change & CHANGE_AUDIO_FMT) { rtf.wFormatTag = (unsigned short) id; } if (change & CHANGE_AUDIO_BR) { rtf.dwAvgBytesPerSec = (long) 1000*brate/8; ash.dwRate = (long) 1000*brate/8; ash.dwScale = 1; } if (change & CHANGE_AUDIO_CHANS) { rtf.wChannels = (short) a_chan; } if (change & CHANGE_AUDIO_BITS) { rtf.wBitsPerSample = (short) a_bits; } if (change & CHANGE_AUDIO_RATE) { rtf.dwSamplesPerSec = (long) a_rate; } lseek(fd, ah_off ,SEEK_SET); hdr_write("audio header [h]", fd, &ash, sizeof(ash)); lseek(fd, af_off ,SEEK_SET); hdr_write("audio header [f]", fd, &rtf, sizeof(rtf)); } err = close(fd); if (err) { perror("close"); exit(1); } avifile = AVI_open_input_file(filename, 1); if (!avifile) { AVI_print_error("AVI open"); exit(1); } tc_log_info(EXE, "updated AVI file %s", filename); AVI_info(avifile); AVI_close(avifile); return 0; }