gephex--main--0.4--patch-1876
[email protected] Thu, 7 Apr 2005 13:03:55 +0200 (CEST)
| Newsgroups | gmane.comp.video.gephex.devel |
|---|---|
| Message-ID | <[email protected]> |
Archive: [email protected] New revision: gephex--main--0.4--patch-1876 -- Revision: gephex--main--0.4--patch-1876 Archive: [email protected] Creator: The Gephex Source Archive <[email protected]> Date: Thu Apr 7 13:01:41 CEST 2005 Standard-date: 2005-04-07 11:01:41 GMT Modified-files: modules/src/ffmpegoutmodule/ffmpegoutmodule.cpp modules/src/ffmpegoutmodule/ffmpegwriter.cpp modules/src/ffmpegoutmodule/ffmpegwriter.h New-patches: [email protected]/gephex--main--0.4--patch-1876 [email protected]/gephex--ffmpegout--0.4--patch-4 [email protected]/gephex--ffmpegout--0.4--patch-5 Summary: [MERGE-REQUEST] bugfix #94 Keywords: Patches applied: * [email protected]/gephex--ffmpegout--0.4--patch-4 tag of [email protected]/gephex--main--0.4--patch-1874 * [email protected]/gephex--ffmpegout--0.4--patch-5 ffmpegoutput errorhandling + bugfix for #94 * added files {arch}/gephex/gephex--ffmpegout/gephex--ffmpegout--0.4/[email protected]/patch-log/patch-4 {arch}/gephex/gephex--ffmpegout/gephex--ffmpegout--0.4/[email protected]/patch-log/patch-5 {arch}/gephex/gephex--main/gephex--main--0.4/[email protected]/patch-log/patch-1876 * modified files --- orig/modules/src/ffmpegoutmodule/ffmpegoutmodule.cpp +++ mod/modules/src/ffmpegoutmodule/ffmpegoutmodule.cpp @@ -29,8 +29,9 @@ #include <string> #include <vector> #include <sstream> - -#include "basic_types.h" +#include <stdexcept> + +#include "basic_types.h" static logT s_log; @@ -44,7 +45,7 @@ ~_MyInstance() { - if (ffmpegWriter) delete ffmpegWriter; + delete ffmpegWriter; framebuffer_deleteInstance(scaledFb); } @@ -89,16 +90,6 @@ const std::string filename(inst->in_filename->text); const std::string encoding(inst->in_encoding->text); - if (filename == "null") - { - if (my.ffmpegWriter != 0) - { - delete my.ffmpegWriter; - my.ffmpegWriter = 0; - } - return; - } - // change size to valid one const size_t xsize = xsize_pre - xsize_pre % 4; const size_t ysize = ysize_pre - ysize_pre % 4; @@ -106,43 +97,69 @@ // yuv4mpeg2 spec or ffpmeg assert(xsize%4==0); assert(ysize%4==0); - - - if (my.ffmpegWriter == 0) - my.ffmpegWriter=new FFMpegWriter(filename,xsize,ysize,encoding); - - if (my.ffmpegWriter->getFilename() != filename || - my.ffmpegWriter->getXres() != xsize || - my.ffmpegWriter->getYres() != ysize || - my.ffmpegWriter->getEncoding() != encoding) + + if (filename == "null") { - delete my.ffmpegWriter; - - my.ffmpegWriter=new FFMpegWriter(filename,xsize,ysize,encoding); + delete my.ffmpegWriter; + my.ffmpegWriter = 0; + return; } - - // the framebuffer - uint32_t* fb; - if (inst->in_in->xsize != my.ffmpegWriter->getXres() || - inst->in_in->ysize != my.ffmpegWriter->getYres()) + try { - FrameBufferAttributes in_attr; - framebuffer_getAttributes(inst->in_in, &in_attr); - in_attr.xsize=my.ffmpegWriter->getXres(); - in_attr.ysize=my.ffmpegWriter->getYres(); - framebuffer_convertType(my.scaledFb, inst->in_in , &in_attr); + if (my.ffmpegWriter == 0) + my.ffmpegWriter=new FFMpegWriter(filename,xsize,ysize,encoding); - // use the scaled one - fb=my.scaledFb->framebuffer; + assert(my.ffmpegWriter != 0); + + if (my.ffmpegWriter->getFilename() != filename || + my.ffmpegWriter->getXres() != xsize || + my.ffmpegWriter->getYres() != ysize || + my.ffmpegWriter->getEncoding() != encoding) + { + delete my.ffmpegWriter; + my.ffmpegWriter=new FFMpegWriter(filename,xsize,ysize,encoding); + } + + assert(my.ffmpegWriter != 0); } - else + catch(std::runtime_error& e) { - // use the original - fb=inst->in_in->framebuffer; + my.ffmpegWriter=0; + s_log( 0, e.what() ); } - my.ffmpegWriter->writeFrame(fb); + if ( my.ffmpegWriter != 0 ) + { + // the framebuffer + uint32_t* fb; + + if (inst->in_in->xsize != my.ffmpegWriter->getXres() || + inst->in_in->ysize != my.ffmpegWriter->getYres()) + { + FrameBufferAttributes in_attr; + framebuffer_getAttributes(inst->in_in, &in_attr); + in_attr.xsize=my.ffmpegWriter->getXres(); + in_attr.ysize=my.ffmpegWriter->getYres(); + framebuffer_convertType(my.scaledFb, inst->in_in , &in_attr); + + // use the scaled one + fb=my.scaledFb->framebuffer; + } + else + { + // use the original + fb=inst->in_in->framebuffer; + } + try + { + my.ffmpegWriter->writeFrame(fb); + } + catch(std::runtime_error& e) + { + s_log(0,e.what()); + } + } } --- orig/modules/src/ffmpegoutmodule/ffmpegwriter.cpp +++ mod/modules/src/ffmpegoutmodule/ffmpegwriter.cpp @@ -21,21 +21,17 @@ #include "ffmpegwriter.h" #include <iostream> #include <string> +#include <stdexcept> + FFMpegWriter::FFMpegWriter(const std::string &filename, int xres, int yres, std::string encoding) + : outfile(filename), encstr(encoding), x_res(xres), y_res(yres) { std::cout << "creating new ffmpeg writer " << filename << " " << xres << "x" << yres << ", encoding: " << encoding << std::endl; - outfile = filename; - - encstr = encoding; - - x_res = xres; - y_res = yres; - av_register_all(); initEncoderMap(); @@ -81,30 +77,28 @@ return encstr; } -int FFMpegWriter::initEncoderMap() -{ - /* - * Had to add the template qualifiers <int, const char*>, because - * otherwise vs6 does not compile... - * georg - */ - encmap["DIVX High"] = std::make_pair<int, const char*>(800000, "avi" ); - encmap["DIVX Low"] = std::make_pair<int, const char*>(200000, "avi" ); - encmap["MPEG2 High"] = std::make_pair<int, const char*>(800000, "mpeg"); - encmap["MPEG2 Low"] = std::make_pair<int, const char*>(200000, "mpeg"); - encmap["RM High"] = std::make_pair<int, const char*>(800000, "rm" ); - encmap["RM Low"] = std::make_pair<int, const char*>(200000, "rm" ); - encmap["MOV High"] = std::make_pair<int, const char*>(800000, "mov" ); - encmap["MOV Low"] = std::make_pair<int, const char*>(200000, "mov" ); - - return 0; +void FFMpegWriter::initEncoderMap() +{ + encmap["DIVX High"] = std::make_pair(800000, std::string("avi") ); + encmap["DIVX Low"] = std::make_pair(200000, std::string("avi") ); + encmap["MPEG2 High"] = std::make_pair(800000, std::string("mpeg")); + encmap["MPEG2 Low"] = std::make_pair(200000, std::string("mpeg")); + encmap["RM High"] = std::make_pair(800000, std::string("rm")); + encmap["RM Low"] = std::make_pair(200000, std::string("rm")); + encmap["MOV High"] = std::make_pair(800000, std::string("mov")); + encmap["MOV Low"] = std::make_pair(200000, std::string("mov")); } -int FFMpegWriter::initEncoder() +void FFMpegWriter::initEncoder() { - fmt = guess_format(encmap.find(encstr)->second.second.c_str(), NULL, NULL); - bps = encmap.find(encstr)->second.first; + encmap_t::const_iterator enc = encmap.find(encstr); + + if ( enc == encmap.end() ) + throw std::runtime_error( "unkown encoder format" ); + + fmt = guess_format( enc->second.second.c_str(), NULL, NULL); + bps = enc->second.first; // use mpeg if unable to guess if (fmt == NULL) @@ -117,8 +111,7 @@ // mpeg not available if (fmt == NULL) { - std::cout << "error initializing mpeg encoder!" << std::endl; - return -1; + std::runtime_error("error initializing mpeg encoder!"); } else { @@ -132,17 +125,14 @@ oc = av_alloc_format_context(); if (oc == NULL) { - std::cout << "ffmpeg: memory error allocating format context" << std::endl; - return -2; + throw std::runtime_error("ffmpeg: memory error allocating format context"); } // set output format oc->oformat = fmt; - - return 0; } -int FFMpegWriter::initStream() +void FFMpegWriter::initStream() { // create the video stream @@ -162,15 +152,12 @@ { if (url_fopen(&oc->pb, outfile.c_str(), URL_WRONLY) < 0) { - std::cout << "Could not open outfile" << std::endl; - return -1; + std::runtime_error("Could not open outfile"); } } // write file header if needed av_write_header(oc); - - return 0; } void FFMpegWriter::cleanup() --- orig/modules/src/ffmpegoutmodule/ffmpegwriter.h +++ mod/modules/src/ffmpegoutmodule/ffmpegwriter.h @@ -44,9 +44,9 @@ private: - int initEncoder(); - int initEncoderMap(); - int initStream(); + void initEncoder(); + void initEncoderMap(); + void initStream(); void cleanup(); void open_video(AVFormatContext *oc, AVStream *st); @@ -61,7 +61,8 @@ int x_res, y_res; unsigned int bps; - std::map<std::string, std::pair<int, std::string> > encmap; + typedef std::map<std::string, std::pair<int, std::string> > encmap_t; + encmap_t encmap; uint8_t *video_outbuf; int video_outbuf_size;