X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftags%2Fstable%2Fsrc%2Fmodules%2Fmod_libavcodec%2Ftrgt_av.cpp;h=bf8d599e59fcbccda551761965a53724215f6f5f;hb=47fce282611fbba1044921d22ca887f9b53ad91a;hp=bb72d40189769150de385421ac4a7bc0d98c8d5b;hpb=46036a57bc1ab5583c5d5c2188e8c52d7682d9d5;p=synfig.git diff --git a/synfig-core/tags/stable/src/modules/mod_libavcodec/trgt_av.cpp b/synfig-core/tags/stable/src/modules/mod_libavcodec/trgt_av.cpp index bb72d40..bf8d599 100644 --- a/synfig-core/tags/stable/src/modules/mod_libavcodec/trgt_av.cpp +++ b/synfig-core/tags/stable/src/modules/mod_libavcodec/trgt_av.cpp @@ -1,27 +1,30 @@ -/* === S I N F G =========================================================== */ -/*! \file trgt.cpp +/* === S Y N F I G ========================================================= */ +/*! \file trgt_av.cpp ** \brief \writeme ** -** $Id: trgt_av.cpp,v 1.1.1.1 2005/01/04 01:23:11 darco Exp $ +** $Id$ ** ** \legal -** Copyright (c) 2002 Robert B. Quattlebaum Jr. +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2008 Paul Wise +** Copyright (c) 2008 Gerco Ballintijn ** -** This software and associated documentation -** are CONFIDENTIAL and PROPRIETARY property of -** the above-mentioned copyright holder. +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. ** -** You may not copy, print, publish, or in any -** other way distribute this software without -** a prior written agreement with -** the copyright holder. +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. ** \endlegal */ /* ========================================================================= */ /* === H E A D E R S ======================================================= */ -#define SINFG_NO_ANGLE +#define SYNFIG_NO_ANGLE #ifdef USING_PCH # include "pch.h" @@ -34,10 +37,33 @@ extern "C" { -#include "libavformat/avformat.h" + +/* + ffmpeg library headers have historically had multiple locations. + We should check all of the locations to be more portable. +*/ + +#ifdef HAVE_LIBAVFORMAT_AVFORMAT_H +# include +#elif defined(HAVE_AVFORMAT_H) +# include +#elif defined(HAVE_FFMPEG_AVFORMAT_H) +# include +#endif + +#ifdef WITH_LIBSWSCALE +#ifdef HAVE_LIBSWSCALE_SWSCALE_H +# include +#elif defined(HAVE_SWSCALE_H) +# include +#elif defined(HAVE_FFMPEG_SWSCALE_H) +# include +#endif +#endif + } -#include +#include #include #include @@ -50,17 +76,17 @@ extern "C" /* === U S I N G =========================================================== */ -using namespace sinfg; +using namespace synfig; using namespace std; using namespace etl; /* === I N F O ============================================================= */ -SINFG_TARGET_INIT(Target_LibAVCodec); -SINFG_TARGET_SET_NAME(Target_LibAVCodec,"libav"); -SINFG_TARGET_SET_EXT(Target_LibAVCodec,"avi"); -SINFG_TARGET_SET_VERSION(Target_LibAVCodec,"0.1"); -SINFG_TARGET_SET_CVS_ID(Target_LibAVCodec,"$Id: trgt_av.cpp,v 1.1.1.1 2005/01/04 01:23:11 darco Exp $"); +SYNFIG_TARGET_INIT(Target_LibAVCodec); +SYNFIG_TARGET_SET_NAME(Target_LibAVCodec,"libav"); +SYNFIG_TARGET_SET_EXT(Target_LibAVCodec,"avi"); +SYNFIG_TARGET_SET_VERSION(Target_LibAVCodec,"0.1"); +SYNFIG_TARGET_SET_CVS_ID(Target_LibAVCodec,"$Id$"); /* === C L A S S E S & S T R U C T S ======================================= */ @@ -73,8 +99,8 @@ struct VideoInfo { int w,h; int fps; - - int bitrate; + + int bitrate; }; struct AudioInfo @@ -88,7 +114,7 @@ AVFrame *alloc_picture(int pix_fmt, int width, int height) AVFrame *picture; uint8_t *picture_buf; int size; - + picture = avcodec_alloc_frame(); if (!picture) return NULL; @@ -98,7 +124,7 @@ AVFrame *alloc_picture(int pix_fmt, int width, int height) av_free(picture); return NULL; } - avpicture_fill((AVPicture *)picture, picture_buf, + avpicture_fill((AVPicture *)picture, picture_buf, pix_fmt, width, height); return picture; } @@ -116,45 +142,45 @@ static void convert_surface_frame(AVFrame *pic, const Surface &s, const Gamma &g Surface::const_pen p = s.begin(); unsigned int w,h; Color c; - + uint8_t *ptr; int stride; - + w = s.size().x; h = s.size().y; - + ptr = pic->data[0]; stride = pic->linesize[0]; for(j = 0; j < h; j++, p.inc_y(), ptr += stride) { uint8_t *tptr = ptr; - + //use convert_color_format instead... #if 0 const int channels = 3; - + for(int i = 0; i < w; i++, p.inc_x(), tptr += channels) { c = p.get_value(); - + Color::value_type r = c.get_r(); Color::value_type g = c.get_g(); Color::value_type b = c.get_b(); Color::value_type a = c.get_a(); - + //premultiply alpha r *= a; g *= a; b *= a; - + //essentially treats it as if it has a background color of black - + //we must also clamp the rgb values [0,1] r = min(1.0f,r); g = min(1.0f,g); b = min(1.0f,b); - + r = max(0.0f,r); g = max(0.0f,g); b = max(0.0f,b); @@ -164,12 +190,12 @@ static void convert_surface_frame(AVFrame *pic, const Surface &s, const Gamma &g tptr[1] = (int)(g*255); tptr[2] = (int)(b*255); } - + p.dec_x(w); #else - + convert_color_format((unsigned char *)tptr,&p.get_value(),w,PF_RGB,gamma); - + #endif } } @@ -183,39 +209,39 @@ public: void *samples; vectoraudiobuffer; - + int audio_input_frame_size; - + bool open(AVFormatContext *formatc, AVStream *stream) { AVCodecContext *context; AVCodec *codec; - + context = &stream->codec; - + //find audio encoder codec = avcodec_find_encoder(context->codec_id); if(!codec) { - sinfg::warning("audio-open: could not find codec"); + synfig::warning("audio-open: could not find codec"); return 0; } - + //open the codec if(avcodec_open(context, codec) < 0) { - sinfg::warning("audio-open: could not open codec"); + synfig::warning("audio-open: could not open codec"); return 0; } - + /* hardcoded example for generating samples array*/ /* t = 0; tincr = 2 * M_PI * 110.0 / c->sample_rate; tincr2 = 2 * M_PI * 110.0 / c->sample_rate / c->sample_rate;*/ - + audiobuffer.resize(10000); - + /* ugly hack for PCM codecs (will be removed ASAP with new PCM support to compute the input frame size in samples */ if (context->frame_size <= 1) { @@ -233,48 +259,48 @@ public: } else { audio_input_frame_size = context->frame_size; } - + //hardcoded array //samples = (int16_t *)malloc(audio_input_frame_size * 2 * c->channels); - + return true; } - + bool write_frame(AVFormatContext *formatc, AVStream *stream, void *samples) { int size; AVCodecContext *context; - + context = &stream->codec; - + //hardcoded in example //must read in from somewhere... //get_audio_frame(samples, audio_input_frame_size, c->channels); - + //encode the audio const short int*samps=(const short int *)samples; //assuming it's set from somewhere right now - + size = avcodec_encode_audio(context, &audiobuffer[0], audiobuffer.size(), samps); - + //write the compressed audio to a file if(av_write_frame(formatc, stream->index, &audiobuffer[0], size) != 0) { - sinfg::warning("audio-write_frame: unable to write the entire audio frame"); + synfig::warning("audio-write_frame: unable to write the entire audio frame"); return 0; } - + return true; } - + void close(AVFormatContext *formatc, AVStream *stream) { //we may also want to catch delayed frames from here (don't for now) - + if(stream) { avcodec_close(&stream->codec); } - + //if(samples)av_free(samples); audiobuffer.resize(0); } @@ -285,136 +311,169 @@ public: class VideoEncoder { public: - AVFrame *encodable; //for compressiong and output to a file (in compatible pixel format) - + AVFrame *encodable; //for compression and output to a file (in compatible pixel format) + vector videobuffer; - + bool startedencoding; - + //int stream_nb_frames; - + bool open(AVFormatContext *formatc, AVStream *stream) { if(!formatc || !stream) { - sinfg::warning("Attempt to open a video codec with a bad format or stream"); + synfig::warning("Attempt to open a video codec with a bad format or stream"); return false; } - + //codec and context AVCodec *codec; AVCodecContext *context; - + //get from inside stream - context = &stream->codec; - + context = stream->codec; + //search for desired codec (contained in the stream) codec = avcodec_find_encoder(context->codec_id); if(!codec) { - sinfg::warning("Open_video: could not find desired codec"); + synfig::warning("Open_video: could not find desired codec"); return 0; } - + //try to open the codec - if(avcodec_open(context, codec) < 0) + if(avcodec_open(context, codec) < 0) { - sinfg::warning("open_video: could not open desired codec"); + synfig::warning("open_video: could not open desired codec"); return 0; } - - videobuffer.resize(0); + + videobuffer.resize(0); if(!(formatc->oformat->flags & AVFMT_RAWPICTURE)) { //resize buffer to desired buffersize videobuffer.resize(200000); //TODO: need to figure out a good size } - + //allocate the base picture which will be used to encode /*picture = alloc_picture(PIX_FMT_RGBA32, context->width, context->height); if(!picture) { - sinfg::warning("open_video: could not allocate the picture to be encoded"); + synfig::warning("open_video: could not allocate the picture to be encoded"); return 0; }*/ - + //if our output (rgb) needs to be translated to a different coordinate system, need a temporary picture in that color space - + /* Should use defaults of RGB Possible formats: PIX_FMT_RGB24 PIX_FMT_BGR24 PIX_FMT_RGBA32 //stored in cpu endianness (!!!!) - + (possibly translate directly to required coordinate systems later on... less error) */ encodable = NULL; if(context->pix_fmt != PIX_FMT_RGB24) { encodable = alloc_picture(context->pix_fmt, context->width, context->height); - if(!encodable) + if(!encodable) { - sinfg::warning("open_video: could not allocate encodable picture"); + synfig::warning("open_video: could not allocate encodable picture"); return 0; } } - + return true; } - + //write a frame with the frame passed in bool write_frame(AVFormatContext *formatc, AVStream *stream, AVFrame *pict) { if(!formatc || !stream) { - sinfg::warning("Attempt to open a video codec with a bad format or stream"); + synfig::warning("Attempt to open a video codec with a bad format or stream"); return false; } - - int size, + + int size, ret = 0; - AVCodecContext *context = &stream->codec; - + AVCodecContext *context = stream->codec; + /* If pict is invalid (NULL), then we are done compressing frames and we are trying to get - the buffer cleared out (or if it's already in the right format) so no transofrm necessary + the buffer cleared out (or if it's already in the right format) so no transform necessary */ if ( pict ) { startedencoding = true; } - - + + if ( pict && context->pix_fmt != PIX_FMT_RGB24 ) { //We're using RGBA at the moment, write custom conversion code later (get less accuracy errors) - img_convert((AVPicture *)encodable, context->pix_fmt, +#ifdef WITH_LIBSWSCALE + struct SwsContext* img_convert_ctx = + sws_getContext(context->width, context->height, PIX_FMT_RGB24, + context->width, context->height, context->pix_fmt, + SWS_BICUBIC, NULL, NULL, NULL); + + sws_scale(img_convert_ctx, pict->data, pict->linesize, + + 0, context->height, encodable->data, + encodable->linesize); + + sws_freeContext (img_convert_ctx); +#else + img_convert((AVPicture *)encodable, context->pix_fmt, (AVPicture *)pict, PIX_FMT_RGB24, context->width, context->height); - +#endif + pict = encodable; } - - //cludge for raw picture format (they said they'd fix) + + AVPacket pkt; + av_init_packet(&pkt); + pkt.stream_index = stream->index; + pkt.data = (uint8_t *)pict; + pkt.size = sizeof(AVPicture); + if( context->coded_frame ) + pkt.pts = context->coded_frame->pts; + if( context->coded_frame && context->coded_frame->key_frame) + pkt.flags |= PKT_FLAG_KEY; + + //kluge for raw picture format (they said they'd fix) if (formatc->oformat->flags & AVFMT_RAWPICTURE) { - ret = av_write_frame(formatc, stream->index, (uint8_t *)pict, sizeof(AVPicture)); + ret = av_write_frame(formatc, &pkt); } - else + else { //encode our given image size = avcodec_encode_video(context, &videobuffer[0], videobuffer.size(), pict); - - //if not zero we've got stuff to write - if (size != 0) + + //if greater than zero we've got stuff to write + if (size > 0) { - ret = av_write_frame(formatc, stream->index, &videobuffer[0], size); - + av_init_packet(&pkt); + pkt.stream_index = stream->index; + pkt.data = &videobuffer[0]; + pkt.size = size; + if( context->coded_frame ) + pkt.pts = context->coded_frame->pts; + if( context->coded_frame && context->coded_frame->key_frame) + pkt.flags |= PKT_FLAG_KEY; + + ret = av_write_frame(formatc, &pkt); + //error detect - possibly throw later... - if(ret != 0) + if(ret < 0) { - sinfg::warning("write_frame: error while writing video frame"); - return false; + synfig::warning("write_frame: error while writing video frame"); + return false; } } //if 0, it was buffered (if invalid picture we don't have ANY data left) @@ -426,25 +485,25 @@ public: return false; startedencoding = false; } - + //buffered picture } } - + return true; } - - void close(AVFormatContext *formatc, AVStream *stream) + + void close(AVFormatContext */*formatc*/, AVStream *stream) { if(stream) - avcodec_close(&stream->codec); - - if (encodable) + avcodec_close(stream->codec); + + if (encodable) { free_picture(encodable); encodable = 0; } - + videobuffer.resize(0); } }; @@ -452,22 +511,22 @@ public: class Target_LibAVCodec::LibAVEncoder { public: - + bool initialized; - + AVOutputFormat *format; //reference to global, do not delete AVFormatContext *formatc; - + AVStream *video_st; //AVStream *audio_st; - + double video_pts; //double audio_pts; VideoEncoder vid; VideoInfo vInfo; - + /*AudioEncoder aud; AudioInfo aInfo;*/ @@ -480,21 +539,21 @@ public: { format = 0; formatc = 0; - + //video settings video_st = 0; video_pts = 0; - + vid.encodable = 0; //vid.stream_nb_frames = 2; //reasonable default - + initialized = false; picture = 0; frame_count = 0; - num_frames = 0; - - //aud.samples = 0; + num_frames = 0; + + //aud.samples = 0; //audio_st = 0; //audio_pts = 0; } @@ -503,7 +562,7 @@ public: { CleanUp(); } - + bool Initialize(const char *filename, const char *typestring) { //guess if we have a type string, otherwise use filename @@ -516,38 +575,38 @@ public: { format = guess_format(NULL, filename, NULL); } - + if(!format) { - sinfg::warning("Unable to Guess the output, defaulting to mpeg"); + synfig::warning("Unable to Guess the output, defaulting to mpeg"); format = guess_format("mpeg", NULL, NULL); } - - if(!format) + + if(!format) { - sinfg::warning("Unable to find output format"); + synfig::warning("Unable to find output format"); return 0; } - + //allocate the output context formatc = (AVFormatContext *)av_mallocz(sizeof(AVFormatContext)); if(!formatc) { - sinfg::warning("Memory error\n"); + synfig::warning("Memory error\n"); return 0; } //set the output format to the one we found formatc->oformat = format; - + //print the output filename snprintf(formatc->filename, sizeof(formatc->filename), "%s", filename); - + //initial video_st = NULL; //audio_st = NULL; - + //video stream - if(format->video_codec != CODEC_ID_NONE) + if(format->video_codec != CODEC_ID_NONE) { video_st = add_video_stream(format->video_codec,vInfo); if(!video_st) @@ -555,38 +614,29 @@ public: av_free(formatc); } } - + //audio stream /*if(format->audio_codec != CODEC_ID_NONE) { audio_st = add_audio_stream(format->audio_codec,aInfo); }*/ - + //set output parameters: required in ALL cases - - AVFormatParameters fmtparam,*ap = &fmtparam; - memset(ap, 0, sizeof(*ap)); - ap->frame_rate = vInfo.fps; - ap->frame_rate_base = 1; - ap->width = vInfo.w; - ap->height = vInfo.h; - //ap->pix_fmt = frame_pix_fmt; - - if(av_set_parameters(formatc, ap) < 0) - { - sinfg::warning("Invalid output formatting parameters"); - return 0; - } - + + video_st->codec->time_base= (AVRational){1,vInfo.fps}; + video_st->codec->width = vInfo.w; + video_st->codec->height = vInfo.h; + video_st->codec->pix_fmt = PIX_FMT_YUV420P; + //dump the formatting information as the file header dump_format(formatc, 0, filename, 1); - + //open codecs and allocate buffers if(video_st) { if(!vid.open(formatc, video_st)) { - sinfg::warning("Could not open video encoder"); + synfig::warning("Could not open video encoder"); return 0; } } @@ -594,63 +644,63 @@ public: { if(!aud.open(formatc, audio_st)) { - sinfg::warning("Could not open audio encoder"); + synfig::warning("Could not open audio encoder"); return 0; - } + } }*/ - + //open output file if(!(format->flags & AVFMT_NOFILE)) { //use libav's file open function (what does it do differently????) if(url_fopen(&formatc->pb, filename, URL_WRONLY) < 0) { - sinfg::warning("Unable to open file: %s", filename); + synfig::warning("Unable to open file: %s", filename); return 0; } } - + //allocate the picture to render to //may have to retrieve the width, height from the codec... for resizing... picture = alloc_picture(PIX_FMT_RGB24,vInfo.w,vInfo.h);//video_st->codec.width, video_st->codec.height); if(!picture) { - sinfg::warning("Unable to allocate the temporary AVFrame surface"); + synfig::warning("Unable to allocate the temporary AVFrame surface"); return 0; } - + initialized = true; //vInfo.w = video_st->codec.width; //vInfo.h = video_st->codec.height; - + //write the stream header av_write_header(formatc); - + return true; } - + void CleanUp() { - int i; - + unsigned int i; + if(picture) free_picture(picture); - + //do all the clean up file rendering if(formatc && video_st) { - //want to scan in delayed frames until no longer needed (TODO) + //want to scan in delayed frames until no longer needed (TODO) if(vid.startedencoding) while( vid.write_frame(formatc, video_st, 0) ); - + //may want to move this... probably to the end of the last frame... av_write_trailer(formatc); } - + //close codecs if (video_st) vid.close(formatc,video_st); /*if (audio_st) aud.close(formatc,audio_st);*/ - + /* write the trailer, if any */ if(formatc) { @@ -659,31 +709,35 @@ public: { av_freep(&formatc->streams[i]); } - + if(!(format->flags & AVFMT_NOFILE)) { /* close the output file */ +#if LIBAVFORMAT_VERSION_INT >= (52<<16) + url_fclose(formatc->pb); +#else url_fclose(&formatc->pb); +#endif } - + /* free the stream */ av_free(formatc); } - + initialized = false; - + format = 0; formatc = 0; - + //video settings video_st = 0; video_pts = 0; - + vid.encodable = 0; //vid.stream_nb_frames = 2; //reasonable default - + initialized = false; - picture = 0; + picture = 0; } //create a video output stream @@ -691,36 +745,37 @@ public: { AVCodecContext *context; AVStream *st; - + st = av_new_stream(formatc, 0); if(!st) { - sinfg::warning("video-add_stream: Unable to allocate stream"); + synfig::warning("video-add_stream: Unable to allocate stream"); return 0; } - - context = &st->codec; + + context = st->codec; context->codec_id = (CodecID)codec_id; context->codec_type = CODEC_TYPE_VIDEO; - + //PARAMETERS MUST BE PASSED IN SOMEHOW (ANOTHER FUNCTION PARAMETER???) - + /* resolution must be a multiple of two */ context->width = info.w; context->height = info.h; - + //have another way to input these context->bit_rate = info.bitrate; //TODO: Make dependant on the quality - + /* frames per second */ - context->frame_rate = info.fps; - context->frame_rate_base = 1; - + // FIXME: Port next two lines to recent libavcodec versions + //context->frame_rate = info.fps; + //context->frame_rate_base = 1; + /* "High Quality" */ context->mb_decision=FF_MB_DECISION_BITS; - + context->gop_size = info.fps/4; /* emit one intra frame every twelve frames at most */ - + //HACK: MPEG requires b frames be set... any better way to do this? if (context->codec_id == CODEC_ID_MPEG1VIDEO || context->codec_id == CODEC_ID_MPEG2VIDEO) @@ -728,32 +783,32 @@ public: /* just for testing, we also add B frames */ context->max_b_frames = 2; } - + return st; } - + // add an audio output stream - AVStream *add_audio_stream(int codec_id,const AudioInfo &aInfo) + AVStream *add_audio_stream(int codec_id,const AudioInfo &/*aInfo*/) { AVCodecContext *context; AVStream *stream; - + stream = av_new_stream(formatc, 1); if(!stream) { - sinfg::warning("could not alloc stream"); + synfig::warning("could not alloc stream"); return 0; } - - context = &stream->codec; - context->codec_id = (CodecID)codec_id; + + context = stream->codec; + context->codec_id = (CodecID)codec_id; context->codec_type = CODEC_TYPE_AUDIO; - + /* put sample parameters */ context->bit_rate = 64000; context->sample_rate = 44100; context->channels = 2; - + return stream; } }; @@ -769,7 +824,7 @@ Target_LibAVCodec::Target_LibAVCodec(const char *Filename): av_register_all(); } set_remove_alpha(); - + data = new LibAVEncoder; } @@ -785,9 +840,9 @@ Target_LibAVCodec::set_rend_desc(RendDesc *given_desc) // to be rendered! given_desc is the suggestion, and // you need to modify it to suit the needs of the codec. // ie: Making the pixel dimensions divisible by 8, etc... - + desc=*given_desc; - + //resize surface (round even) int w = desc.get_w(); int h = desc.get_h(); @@ -795,47 +850,47 @@ Target_LibAVCodec::set_rend_desc(RendDesc *given_desc) Point br = desc.get_br(); Real pw = desc.get_pw(); Real ph = desc.get_ph(); - + //resize to the size it should be... //desc.set_subwindow(-offx/2,-offy/2, desc.get_w() - offx?(offx + 8):0, desc.get_h() - offy?(offy + 8):0); - //if resolution is broken, change the size... or something + //if resolution is broken, change the size... or something //budge to nearest pixel values if(w&1) { w += 1; tl[0] -= pw/2; - br[0] += pw/2; + br[0] += pw/2; } - + if(h&1) { h += 1; tl[1] -= ph/2; br[1] += ph/2; } - + desc.set_w(w); desc.set_h(h); desc.set_tl(tl); desc.set_br(br); - + data->vInfo.w = w; data->vInfo.h = h; - + //may want to round frame rate data->vInfo.fps = (int)floor(desc.get_frame_rate()+0.5); #define MEGABYTES_PER_HOUR(x) (((x)*1024/3600*1024*8)/*/640*w/480*h*/) data->vInfo.bitrate = MEGABYTES_PER_HOUR(400); //data->vInfo.bitrate = 800000; //make customizable somehow - + desc.set_frame_rate(data->vInfo.fps); - + data->frame_count = desc.get_frame_start(); data->num_frames = desc.get_frame_end()+1; //number of frames should be 1 greater than the last one - + surface.set_wh(data->vInfo.w,data->vInfo.h); - + return true; } @@ -844,46 +899,46 @@ Target_LibAVCodec::end_frame() { //AVStream *audio_st = data->audio_st; AVStream *video_st = data->video_st; - + AVFormatContext *formatc = data->formatc; - + //double &audio_pts = data->audio_pts; //double &video_pts = data->video_pts; - - //ignore audio for now + + //ignore audio for now /*if (audio_st) audio_pts = (double)audio_st->pts.val * formatc->pts_num / formatc->pts_den; else audio_pts = 0.0; - + if (video_st) video_pts = (double)video_st->pts.val * formatc->pts_num / formatc->pts_den; else video_pts = 0.0;*/ //hardcoded crappiness - /*if ((!audio_st || audio_pts >= STREAM_DURATION) && + /*if ((!audio_st || audio_pts >= STREAM_DURATION) && (!video_st || video_pts >= STREAM_DURATION)) break;*/ - + if(data->frame_count >= data->num_frames) return; - + //copy the current surface to the buffer if(data->picture)convert_surface_frame(data->picture,surface,gamma()); - + //encode the frame and write it to the file if(!data->vid.write_frame(formatc,video_st,data->picture)) { - sinfg::warning("Unable to write a frame"); + synfig::warning("Unable to write a frame"); } - + data->frame_count++; if(data->frame_count >= data->num_frames) { data->CleanUp(); } - + /* write interleaved audio and video frames */ /*if (!video_st || (video_st && audio_st && audio_pts < video_pts)) { data->aud.write_frame(formatc,audio_st); @@ -893,10 +948,10 @@ Target_LibAVCodec::end_frame() } bool -Target_LibAVCodec::start_frame(sinfg::ProgressCallback *callback) -{ +Target_LibAVCodec::start_frame(synfig::ProgressCallback */*callback*/) +{ //prepare all the color buffer stuff, etc. - + return true; } @@ -904,7 +959,7 @@ Color * Target_LibAVCodec::start_scanline(int scanline) { return surface[scanline]; - + return 0; // This should kill the render process } @@ -917,12 +972,12 @@ Target_LibAVCodec::end_scanline() bool Target_LibAVCodec::init() { - //hardcode test for mpeg + //hardcoded test for mpeg if(!data->Initialize(filename.c_str(),NULL)) { - sinfg::warning("Unable to Initialize the audio video encoders"); + synfig::warning("Unable to Initialize the audio video encoders"); return 0; } - + return true; }