static void vorbis_process(stream_processor *stream, ogg_page *page ) { ogg_packet packet; misc_vorbis_info *inf = stream->data; int i, header=0; int k; ogg_stream_pagein(&stream->os, page); if(inf->doneheaders < 3) header = 1; while(ogg_stream_packetout(&stream->os, &packet) > 0) { if(inf->doneheaders < 3) { if(vorbis_synthesis_headerin(&inf->vi, &inf->vc, &packet) < 0) { warn(_("Warning: Could not decode vorbis header " "packet - invalid vorbis stream (%d)\n"), stream->num); continue; } inf->doneheaders++; if(inf->doneheaders == 3) { if(ogg_page_granulepos(page) != 0 || ogg_stream_packetpeek(&stream->os, NULL) == 1) warn(_("Warning: Vorbis stream %d does not have headers " "correctly framed. Terminal header page contains " "additional packets or has non-zero granulepos\n"), stream->num); info(_("Vorbis headers parsed for stream %d, " "information follows...\n"), stream->num); info(_("Version: %d\n"), inf->vi.version); k = 0; while(releases[k].vendor_string) { if(!strcmp(inf->vc.vendor, releases[k].vendor_string)) { info(_("Vendor: %s (%s)\n"), inf->vc.vendor, releases[k].desc); break; } k++; } if(!releases[k].vendor_string) info(_("Vendor: %s\n"), inf->vc.vendor); info(_("Channels: %d\n"), inf->vi.channels); info(_("Rate: %ld\n\n"), inf->vi.rate); if(inf->vi.bitrate_nominal > 0) info(_("Nominal bitrate: %f kb/s\n"), (double)inf->vi.bitrate_nominal / 1000.0); else info(_("Nominal bitrate not set\n")); if(inf->vi.bitrate_upper > 0) info(_("Upper bitrate: %f kb/s\n"), (double)inf->vi.bitrate_upper / 1000.0); else info(_("Upper bitrate not set\n")); if(inf->vi.bitrate_lower > 0) info(_("Lower bitrate: %f kb/s\n"), (double)inf->vi.bitrate_lower / 1000.0); else info(_("Lower bitrate not set\n")); if(inf->vc.comments > 0) info(_("User comments section follows...\n")); for(i=0; i < inf->vc.comments; i++) { char *comment = inf->vc.user_comments[i]; check_xiph_comment(stream, i, comment, inf->vc.comment_lengths[i]); } } } } if(!header) { ogg_int64_t gp = ogg_page_granulepos(page); if(gp > 0) { if(gp < inf->lastgranulepos) #ifdef _WIN32 warn(_("Warning: granulepos in stream %d decreases from %I64d to %I64d" ), stream->num, inf->lastgranulepos, gp); #else warn(_("Warning: granulepos in stream %d decreases from %lld to %lld" ), stream->num, inf->lastgranulepos, gp); #endif inf->lastgranulepos = gp; } else { warn(_("Negative granulepos on vorbis stream outside of headers. This file was created by a buggy encoder\n")); } if(inf->firstgranulepos < 0) { /* Not set yet */ } inf->bytes += page->header_len + page->body_len; } }
static void theora_process(stream_processor *stream, ogg_page *page) { ogg_packet packet; misc_theora_info *inf = stream->data; int i, header=0; int res; ogg_stream_pagein(&stream->os, page); if(inf->doneheaders < 3) header = 1; while(1) { res = ogg_stream_packetout(&stream->os, &packet); if(res < 0) { warn(_("WARNING: discontinuity in stream (%d)\n"), stream->num); continue; } else if (res == 0) break; if(inf->doneheaders < 3) { if(theora_decode_header(&inf->ti, &inf->tc, &packet) < 0) { warn(_("WARNING: Could not decode Theora header " "packet - invalid Theora stream (%d)\n"), stream->num); continue; } inf->doneheaders++; if(inf->doneheaders == 3) { if(ogg_page_granulepos(page) != 0 || ogg_stream_packetpeek(&stream->os, NULL) == 1) warn(_("WARNING: Theora stream %d does not have headers " "correctly framed. Terminal header page contains " "additional packets or has non-zero granulepos\n"), stream->num); info(_("Theora headers parsed for stream %d, " "information follows...\n"), stream->num); info(_("Version: %d.%d.%d\n"), inf->ti.version_major, inf->ti.version_minor, inf->ti.version_subminor); info(_("Vendor: %s\n"), inf->tc.vendor); info(_("Width: %d\n"), inf->ti.frame_width); info(_("Height: %d\n"), inf->ti.frame_height); info(_("Total image: %d by %d, crop offset (%d, %d)\n"), inf->ti.width, inf->ti.height, inf->ti.offset_x, inf->ti.offset_y); if(inf->ti.offset_x + inf->ti.frame_width > inf->ti.width) warn(_("Frame offset/size invalid: width incorrect\n")); if(inf->ti.offset_y + inf->ti.frame_height > inf->ti.height) warn(_("Frame offset/size invalid: height incorrect\n")); if(inf->ti.fps_numerator == 0 || inf->ti.fps_denominator == 0) warn(_("Invalid zero framerate\n")); else info(_("Framerate %d/%d (%.02f fps)\n"), inf->ti.fps_numerator, inf->ti.fps_denominator, (float)inf->ti.fps_numerator/(float)inf->ti.fps_denominator); if(inf->ti.aspect_numerator == 0 || inf->ti.aspect_denominator == 0) { info(_("Aspect ratio undefined\n")); } else { float frameaspect = (float)inf->ti.frame_width/(float)inf->ti.frame_height * (float)inf->ti.aspect_numerator/(float)inf->ti.aspect_denominator; info(_("Pixel aspect ratio %d:%d (%f:1)\n"), inf->ti.aspect_numerator, inf->ti.aspect_denominator, (float)inf->ti.aspect_numerator/(float)inf->ti.aspect_denominator); if(fabs(frameaspect - 4.0/3.0) < 0.02) info(_("Frame aspect 4:3\n")); else if(fabs(frameaspect - 16.0/9.0) < 0.02) info(_("Frame aspect 16:9\n")); else info(_("Frame aspect %f:1\n"), frameaspect); } if(inf->ti.colorspace == OC_CS_ITU_REC_470M) info(_("Colourspace: Rec. ITU-R BT.470-6 System M (NTSC)\n")); else if(inf->ti.colorspace == OC_CS_ITU_REC_470BG) info(_("Colourspace: Rec. ITU-R BT.470-6 Systems B and G (PAL)\n")); else info(_("Colourspace unspecified\n")); if(inf->ti.pixelformat == OC_PF_420) info(_("Pixel format 4:2:0\n")); else if(inf->ti.pixelformat == OC_PF_422) info(_("Pixel format 4:2:2\n")); else if(inf->ti.pixelformat == OC_PF_444) info(_("Pixel format 4:4:4\n")); else warn(_("Pixel format invalid\n")); info(_("Target bitrate: %d kbps\n"), inf->ti.target_bitrate/1000); info(_("Nominal quality setting (0-63): %d\n"), inf->ti.quality); if(inf->tc.comments > 0) info(_("User comments section follows...\n")); for(i=0; i < inf->tc.comments; i++) { char *comment = inf->tc.user_comments[i]; check_xiph_comment(stream, i, comment, inf->tc.comment_lengths[i]); } } } else { ogg_int64_t framenum; ogg_int64_t iframe,pframe; ogg_int64_t gp = packet.granulepos; if(gp > 0) { iframe=gp>>inf->ti.granule_shift; pframe=gp-(iframe<<inf->ti.granule_shift); framenum = iframe+pframe; if(inf->framenum_expected >= 0 && inf->framenum_expected != framenum) { warn(_("WARNING: Expected frame %" I64FORMAT ", got %" I64FORMAT "\n"), inf->framenum_expected, framenum); } inf->framenum_expected = framenum + 1; } else if (inf->framenum_expected >= 0) { inf->framenum_expected++; } }
static void theora_process(stream_processor *stream, ogg_page *page) { ogg_packet packet; misc_theora_info *inf = stream->data; int i, header=0; ogg_stream_pagein(&stream->os, page); if(inf->doneheaders < 3) header = 1; while(ogg_stream_packetout(&stream->os, &packet) > 0) { if(inf->doneheaders < 3) { if(theora_decode_header(&inf->ti, &inf->tc, &packet) < 0) { warn(_("Warning: Could not decode theora header " "packet - invalid theora stream (%d)\n"), stream->num); continue; } inf->doneheaders++; if(inf->doneheaders == 3) { if(ogg_page_granulepos(page) != 0 || ogg_stream_packetpeek(&stream->os, NULL) == 1) warn(_("Warning: Theora stream %d does not have headers " "correctly framed. Terminal header page contains " "additional packets or has non-zero granulepos\n"), stream->num); info(_("Theora headers parsed for stream %d, " "information follows...\n"), stream->num); info(_("Version: %d.%d.%d\n"), inf->ti.version_major, inf->ti.version_minor, inf->ti.version_subminor); info(_("Vendor: %s\n"), inf->tc.vendor); info(_("Width: %d\n"), inf->ti.frame_width); info(_("Height: %d\n"), inf->ti.frame_height); info(_("Total image: %d by %d, crop offset (%d, %d)\n"), inf->ti.width, inf->ti.height, inf->ti.offset_x, inf->ti.offset_y); if(inf->ti.offset_x + inf->ti.frame_width > inf->ti.width) warn(_("Frame offset/size invalid: width incorrect\n")); if(inf->ti.offset_y + inf->ti.frame_height > inf->ti.height) warn(_("Frame offset/size invalid: height incorrect\n")); if(inf->ti.fps_numerator == 0 || inf->ti.fps_denominator == 0) warn(_("Invalid zero framerate\n")); else info(_("Framerate %d/%d (%.02f fps)\n"), inf->ti.fps_numerator, inf->ti.fps_denominator, (float)inf->ti.fps_numerator/(float)inf->ti.fps_denominator); if(inf->ti.aspect_numerator == 0 || inf->ti.aspect_denominator == 0) { info(_("Aspect ratio undefined\n")); } else { float frameaspect = (float)inf->ti.frame_width/(float)inf->ti.frame_height * (float)inf->ti.aspect_numerator/(float)inf->ti.aspect_denominator; info(_("Pixel aspect ratio %d:%d (1:%f)\n"), inf->ti.aspect_numerator, inf->ti.aspect_denominator, (float)inf->ti.aspect_numerator/(float)inf->ti.aspect_denominator); if(abs(frameaspect - 4.0/3.0) < 0.02) info(_("Frame aspect 4:3\n")); else if(abs(frameaspect - 16.0/9.0) < 0.02) info(_("Frame aspect 16:9\n")); else info(_("Frame aspect 1:%d\n"), frameaspect); } if(inf->ti.colorspace == OC_CS_ITU_REC_470M) info(_("Colourspace: Rec. ITU-R BT.470-6 System M (NTSC)\n")); else if(inf->ti.colorspace == OC_CS_ITU_REC_470BG) info(_("Colourspace: Rec. ITU-R BT.470-6 Systems B and G (PAL)\n")); else info(_("Colourspace unspecified\n")); if(inf->ti.pixelformat == OC_PF_420) info(_("Pixel format 4:2:0\n")); else if(inf->ti.pixelformat == OC_PF_422) info(_("Pixel format 4:2:2\n")); else if(inf->ti.pixelformat == OC_PF_444) info(_("Pixel format 4:4:4\n")); else warn(_("Pixel format invalid\n")); info(_("Target bitrate: %d kbps\n"), inf->ti.target_bitrate/1000); info(_("Nominal quality setting (0-63): %d\n"), inf->ti.quality); if(inf->tc.comments > 0) info(_("User comments section follows...\n")); for(i=0; i < inf->tc.comments; i++) { char *comment = inf->tc.user_comments[i]; check_xiph_comment(stream, i, comment, inf->tc.comment_lengths[i]); } } } } if(!header) { ogg_int64_t gp = ogg_page_granulepos(page); if(gp > 0) { if(gp < inf->lastgranulepos) #ifdef _WIN32 warn(_("Warning: granulepos in stream %d decreases from %I64d to %I64d" ), stream->num, inf->lastgranulepos, gp); #else warn(_("Warning: granulepos in stream %d decreases from %lld to %lld" ), stream->num, inf->lastgranulepos, gp); #endif inf->lastgranulepos = gp; } if(inf->firstgranulepos < 0) { /* Not set yet */ } inf->bytes += page->header_len + page->body_len; } }