[nut]: r179 - in trunk/nututils: demux_avi.c demux_ogg.c framer_mpeg4.c framer_vorbis.c nutmerge.c nutmerge.h

Author: ods15 Date: Sat Nov 4 13:50:47 2006 New Revision: 179 Modified: trunk/nututils/demux_avi.c trunk/nututils/demux_ogg.c trunk/nututils/framer_mpeg4.c trunk/nututils/framer_vorbis.c trunk/nututils/nutmerge.c trunk/nututils/nutmerge.h Log: add somewhat better error messaging in nutmerge using enum Modified: trunk/nututils/demux_avi.c ============================================================================== --- trunk/nututils/demux_avi.c (original) +++ trunk/nututils/demux_avi.c Sat Nov 4 13:50:47 2006 @@ -19,7 +19,7 @@ #define FIXENDIAN16(a) do{}while(0) #endif -#define FREAD(file, len, var) do { if (fread((var), 1, (len), (file)) != (len)) return 1; }while(0) +#define FREAD(file, len, var) do { if (fread((var), 1, (len), (file)) != (len)) return err_unexpected_eof; }while(0) typedef struct riff_tree_s { uint32_t len; @@ -208,12 +208,12 @@ for (i = 0; i < tree->amount; i++) { if (tree->tree[i].type == 1 && !strncmp(tree->tree[i].name, "strh", 4)) { - if (tree->tree[i].len != 56) return 2; + if (tree->tree[i].len != 56) return err_avi_bad_strh_len; stream->strh = (AVIStreamHeader*)tree->tree[i].data; break; } } - if (i == tree->amount) return 3; + if (i == tree->amount) return err_avi_no_strh; for(i = 2; i < 12; i++) FIXENDIAN32(((uint32_t*)stream->strh)[i]); @@ -222,7 +222,7 @@ int len = tree->tree[i].len; switch(strFOURCC(stream->strh->fccType)) { case mmioFOURCC('v','i','d','s'): - if (len < 40) return 4; + if (len < 40) return err_avi_bad_vids_len; stream->type = 0; stream->video = (BITMAPINFOHEADER*)tree->tree[i].data; for(j = 0; j < 3; j++) FIXENDIAN32(((uint32_t*)stream->video)[j]); @@ -232,7 +232,7 @@ if (len > 40) stream->extra = (uint8_t*)tree->tree[i].data + 40; break; case mmioFOURCC('a','u','d','s'): - if (len < 18) return 5; + if (len < 18) return err_avi_bad_auds_len; stream->type = 1; stream->audio = (WAVEFORMATEX *)tree->tree[i].data; for(j = 1; j < 2; j++) FIXENDIAN16(((uint16_t*)stream->audio)[j]); @@ -242,12 +242,12 @@ if (len > 18) stream->extra = (uint8_t*)tree->tree[i].data + 18; break; default: - return 6; + return err_avi_bad_strf_type; } break; } } - if (i == tree->amount) return 7; + if (i == tree->amount) return err_avi_no_strf; return 0; } @@ -259,16 +259,16 @@ for (i = 0; i < tree->amount; i++) { if (tree->tree[i].type == 1 && !strncmp(tree->tree[i].name, "avih", 4)) { - if (tree->tree[i].len != 56) return 8; + if (tree->tree[i].len != 56) return err_avi_bad_avih_len; avi->avih = (MainAVIHeader*)tree->tree[i].data; break; } } - if (i == tree->amount) return 9; + if (i == tree->amount) return err_avi_no_avih; for(i = 0; i < 14; i++) FIXENDIAN32(((uint32_t*)avi->avih)[i]); - if (avi->avih->dwStreams > 200) return 10; + if (avi->avih->dwStreams > 200) return err_avi_stream_overflow; avi->stream = malloc(avi->avih->dwStreams * sizeof(AVIStreamContext)); for (i = 0; i < avi->avih->dwStreams; i++) { avi->stream[i].video = NULL; @@ -282,7 +282,7 @@ if ((err = avi_read_stream_header(&avi->stream[tmp++], &tree->tree[i]))) return err; } } - if (tmp != avi->avih->dwStreams) return 11; + if (tmp != avi->avih->dwStreams) return err_avi_no_strl; return 0; } @@ -291,16 +291,16 @@ int i, err; if ((err = get_full_riff_tree(avi->in, avi->riff))) return err; tree = &avi->riff->tree[0]; - if (tree->type != 0) return 12; - if (strncmp(tree->name, "RIFF", 4)) return 13; - if (strncmp(tree->listname, "AVI ", 4)) return 14; + if (tree->type != 0) return err_avi_bad_riff; + if (strncmp(tree->name, "RIFF", 4)) return err_avi_bad_riff; + if (strncmp(tree->listname, "AVI ", 4)) return err_avi_bad_avi; for (i = 0; i < tree->amount; i++) { if (tree->tree[i].type == 0 && !strncmp(tree->tree[i].listname, "hdrl", 4)) { if ((err = avi_read_main_header(avi, &tree->tree[i]))) return err; break; } } - if (i == tree->amount) return 15; + if (i == tree->amount) return err_avi_no_hdrl; for (i = 0; i < avi->riff->amount; i++) { int j; tree = &avi->riff->tree[i]; @@ -318,14 +318,14 @@ } if (j != tree->amount) break; } - if (i == avi->riff->amount) return 16; + if (i == avi->riff->amount) return err_avi_no_idx; for (i = 0; i < tree->amount; i++) { if (tree->tree[i].type == 0 && !strncmp(tree->tree[i].listname, "movi", 4)) { fseek(avi->in, tree->tree[i].offset + 12, SEEK_SET); break; } } - if (i == tree->amount) return 17; + if (i == tree->amount) return err_avi_no_movi; return 0; } @@ -344,10 +344,10 @@ for (j = sizeof(fourccs)/sizeof(fourccs[0]); j--; ) { if (!strncmp(avi->stream[i].video->biCompression, fourccs[j], 4)) break; } - if (j == -1) return 18; + if (j == -1) return err_avi_no_video_codec; } else { if (avi->stream[i].audio->wFormatTag[0] != 0x55 || - avi->stream[i].audio->wFormatTag[1] != 0x00) return 19; + avi->stream[i].audio->wFormatTag[1] != 0x00) return err_avi_no_audio_codec; } } @@ -422,7 +422,7 @@ p.p.next_pts = p.p.pts = 0; if ((unsigned)(fourcc[0] - '0') > 9 || (unsigned)(fourcc[1] - '0') > 9 || p.p.stream >= avi->avih->dwStreams) { fprintf(stderr, "%d %4.4s\n", avi->cur, fourcc); - return 3; + return err_avi_bad_packet; } if (p.p.stream == 1) { // 0.5 secs of audio or a single packet Modified: trunk/nututils/demux_ogg.c ============================================================================== --- trunk/nututils/demux_ogg.c (original) +++ trunk/nututils/demux_ogg.c Sat Nov 4 13:50:47 2006 @@ -57,7 +57,7 @@ int len, tot = 0; FREAD(ogg->in, 27, tmp_header); - if (strncmp(tmp_header, "OggS", 5)) return 2; // including version + if (strncmp(tmp_header, "OggS", 5)) return err_bad_oggs_magic; // including version serial = (tmp_header[14] << 24) | (tmp_header[15] << 16) | @@ -111,7 +111,7 @@ if (codecs[j].magic_len > ogg->s[i].packets[0].p.len) continue; if (!memcmp(codecs[j].magic, ogg->s[i].packets[0].buf, codecs[j].magic_len)) break; } - if (!codecs[j].magic) return 6; + if (!codecs[j].magic) return err_ogg_no_codec; ogg->s[i].codec_id = codecs[j].id; } @@ -124,7 +124,7 @@ int err, dummy; if ((err = read_page(ogg, &dummy))) return err; - if (ogg->stream_count != ogg->nstreams) return 2; + if (ogg->stream_count != ogg->nstreams) return err_ogg_non_interleaved; return 0; } Modified: trunk/nututils/framer_mpeg4.c ============================================================================== --- trunk/nututils/framer_mpeg4.c (original) +++ trunk/nututils/framer_mpeg4.c Sat Nov 4 13:50:47 2006 @@ -15,7 +15,7 @@ *type = *buf >> 6; return 0; } - return 13; + return err_mpeg4_no_frame_type; } #define CHECK(x) do{ if ((err = (x))) return err; }while(0) Modified: trunk/nututils/framer_vorbis.c ============================================================================== --- trunk/nututils/framer_vorbis.c (original) +++ trunk/nututils/framer_vorbis.c Sat Nov 4 13:50:47 2006 @@ -37,7 +37,7 @@ uint64_t val = 0; int pos = 0; bp->left -= bits; - if (bp->left < 0) return 1; + if (bp->left < 0) return err_vorbis_header; if (!bits) return 0; if (bp->pos) { @@ -88,7 +88,7 @@ } for (i = 0; i < 3; i++) { memcpy(p, pd[i].buf, pd[i].p.len); p += pd[i].p.len; } - if (pd[0].p.len < 30) { err = 1; goto err_out; } + if (pd[0].p.len < 30) { err = err_vorbis_header; goto err_out; } p = pd[0].buf; channels = p[11]; sample_rate = (p[15] << 24) | (p[14] << 16) | (p[13] << 8) | p[12]; @@ -116,7 +116,7 @@ bp.left = pd[2].p.len*8; bp.pos = 0; - CHECK(get_bits(&bp, 8, &num)); if (num != 5) { err = 2; goto err_out; } + CHECK(get_bits(&bp, 8, &num)); if (num != 5) { err = err_vorbis_header; goto err_out; } CHECK(get_bits(&bp, 8*6, NULL)); // "vorbis" // codebook @@ -158,7 +158,7 @@ break; case 2: j = dimentions * entries; break; default: - err = 3; + err = err_vorbis_header; goto err_out; } if (j >= 0) { @@ -212,7 +212,7 @@ CHECK(get_bits(&bp, classes[class_list[j]]*rangebits, NULL)); } }} - } else { err = 5; goto err_out; } // unknown floor + } else { err = err_vorbis_header; goto err_out; } // unknown floor } // residues @@ -220,7 +220,7 @@ for (; i > 0; i--) { int j, classifications; CHECK(get_bits(&bp, 16, &num)); - if ((int)num > 2) { err = 6; goto err_out; } // unkown residue + if ((int)num > 2) { err = err_vorbis_header; goto err_out; } // unkown residue CHECK(get_bits(&bp, 24, NULL)); // residue_begin CHECK(get_bits(&bp, 24, NULL)); // residue_end CHECK(get_bits(&bp, 24, NULL)); // residue_partition_size @@ -249,7 +249,7 @@ for (; i > 0; i--) { int submaps = 1; CHECK(get_bits(&bp, 16, &num)); // type - if (num) { err = 7; goto err_out; } // bad mapping type + if (num) { err = err_vorbis_header; goto err_out; } // bad mapping type CHECK(get_bits(&bp, 1, &num)); // is submaps if (num) { CHECK(get_bits(&bp, 4, &num)); @@ -261,7 +261,7 @@ CHECK(get_bits(&bp, ilog(channels - 1) * 2 * (num + 1), NULL)); } CHECK(get_bits(&bp, 2, &num)); // reserved - if (num) { err = 8; goto err_out; } + if (num) { err = err_vorbis_header; goto err_out; } if (submaps > 1) CHECK(get_bits(&bp, 4 * channels, NULL)); CHECK(get_bits(&bp, submaps*(8+8+8), NULL)); } @@ -275,7 +275,7 @@ CHECK(get_bits(&bp, 16 + 16 + 8, NULL)); } CHECK(get_bits(&bp, 1, &num)); // framing - if (!num) { err = 9; goto err_out; } + if (!num) { err = err_vorbis_header; goto err_out; } err_out: for (i = 0; i < pd_read; i++) free(pd[i].buf); @@ -297,7 +297,7 @@ bp.pos = 0; CHECK(get_bits(&bp, 1, NULL)); CHECK(get_bits(&bp, ilog(vc->mode_count - 1), &num)); - if ((int)num >= vc->mode_count) return 10; // ERROR + if ((int)num >= vc->mode_count) return err_vorbis_packet; // ERROR mode = vc->modes[num]; prevbs = nextbs = mybs = vc->blocksize[mode]; @@ -316,7 +316,7 @@ p->p.next_pts = vc->pts; p->p.flags = NUT_FLAG_KEY; err_out: - return err; + return err == err_vorbis_header ? err_vorbis_packet : err; } static framer_priv_t * init(stream_t * s) { Modified: trunk/nututils/nutmerge.c ============================================================================== --- trunk/nututils/nutmerge.c (original) +++ trunk/nututils/nutmerge.c Sat Nov 4 13:50:47 2006 @@ -195,5 +195,34 @@ if (in) fclose(in); if (out) fclose(out); if (stats) fclose(stats); + if (err) switch ((enum nutmerge_errors)err) { +#define ERR_CASE(a) case a: fprintf(stderr, "%s\n", #a); break; + ERR_CASE(err_unexpected_eof) + ERR_CASE(err_avi_bad_riff) + ERR_CASE(err_avi_bad_avi) + ERR_CASE(err_avi_no_avih) + ERR_CASE(err_avi_no_strl) + ERR_CASE(err_avi_no_strh) + ERR_CASE(err_avi_no_strf) + ERR_CASE(err_avi_no_hdrl) + ERR_CASE(err_avi_no_idx) + ERR_CASE(err_avi_no_movi) + ERR_CASE(err_avi_bad_avih_len) + ERR_CASE(err_avi_bad_strh_len) + ERR_CASE(err_avi_bad_vids_len) + ERR_CASE(err_avi_bad_auds_len) + ERR_CASE(err_avi_bad_strf_type) + ERR_CASE(err_avi_stream_overflow) + ERR_CASE(err_avi_no_video_codec) + ERR_CASE(err_avi_no_audio_codec) + ERR_CASE(err_avi_bad_packet) + ERR_CASE(err_mpeg4_no_frame_type) + ERR_CASE(err_bad_oggs_magic) + ERR_CASE(err_ogg_no_codec) + ERR_CASE(err_ogg_non_interleaved) + ERR_CASE(err_vorbis_header) + ERR_CASE(err_vorbis_packet) +#undef ERR_CASE + } return err; } Modified: trunk/nututils/nutmerge.h ============================================================================== --- trunk/nututils/nutmerge.h (original) +++ trunk/nututils/nutmerge.h Sat Nov 4 13:50:47 2006 @@ -67,3 +67,31 @@ int get_stream_packet(stream_t * stream, packet_t * p); void free_streams(stream_t * streams); // all the way to -1 terminated list, not the actual 'streams' though + +enum nutmerge_errors { + err_unexpected_eof = 1, + err_avi_bad_riff, + err_avi_bad_avi, + err_avi_no_avih, + err_avi_no_strl, + err_avi_no_strh, + err_avi_no_strf, + err_avi_no_hdrl, + err_avi_no_idx, + err_avi_no_movi, + err_avi_bad_avih_len, + err_avi_bad_strh_len, + err_avi_bad_vids_len, + err_avi_bad_auds_len, + err_avi_bad_strf_type, + err_avi_stream_overflow, + err_avi_no_video_codec, + err_avi_no_audio_codec, + err_avi_bad_packet, + err_mpeg4_no_frame_type, + err_bad_oggs_magic, + err_ogg_no_codec, + err_ogg_non_interleaved, + err_vorbis_header, + err_vorbis_packet, +};
participants (1)
-
ods15