[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36934] trunk/blender: == FFMPEG ==

Peter Schlaile peter at schlaile.de
Thu May 26 23:57:03 CEST 2011


Revision: 36934
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36934
Author:   schlaile
Date:     2011-05-26 21:57:02 +0000 (Thu, 26 May 2011)
Log Message:
-----------
== FFMPEG ==

* removed a lot of old cruft code for ancient ffmpeg versions
* made it compile again against latest ffmpeg / libav GIT
  (also shouldn't break distro ffmpegs, since those API changes
  have been introduced over a year ago. If it nevertheless breaks,
  please send me an email)

Modified Paths:
--------------
    trunk/blender/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
    trunk/blender/source/blender/blenkernel/intern/writeffmpeg.c
    trunk/blender/source/blender/imbuf/intern/anim_movie.c
    trunk/blender/source/blender/imbuf/intern/util.c
    trunk/blender/source/blender/makesrna/intern/rna_scene.c
    trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.cpp
    trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.h

Modified: trunk/blender/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
===================================================================
--- trunk/blender/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp	2011-05-26 21:04:01 UTC (rev 36933)
+++ trunk/blender/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp	2011-05-26 21:57:02 UTC (rev 36934)
@@ -52,6 +52,10 @@
 
 	int read_length, data_size;
 
+	AVPacket tmp_pkt;
+	
+	av_init_packet(&tmp_pkt);
+
 	// as long as there is still data in the package
 	while(audio_pkg_size > 0)
 	{
@@ -64,16 +68,15 @@
 
 		// read samples from the packet
 		data_size = buf_size - buf_pos;
-		/*read_length = avcodec_decode_audio3(m_codecCtx,
-			(int16_t*)(((data_t*)buffer.getBuffer())+buf_pos),
-			&data_size,
-			packet);*/
-		read_length = avcodec_decode_audio2(m_codecCtx,
-						(int16_t*)(((data_t*)buffer.getBuffer()) + buf_pos),
-						&data_size,
-						audio_pkg_data,
-						audio_pkg_size);
 
+		tmp_pkt.data = audio_pkg_data;
+		tmp_pkt.size = audio_pkg_size;
+
+		read_length = avcodec_decode_audio3(
+			m_codecCtx,
+			(int16_t*)(((data_t*)buffer.getBuffer()) + buf_pos),
+			&data_size, &tmp_pkt);
+
 		// read error, next packet!
 		if(read_length < 0)
 			break;
@@ -112,7 +115,7 @@
 
 	for(unsigned int i = 0; i < m_formatCtx->nb_streams; i++)
 	{
-		if((m_formatCtx->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO)
+		if((m_formatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
 			&& (m_stream < 0))
 		{
 			m_stream=i;

Modified: trunk/blender/source/blender/blenkernel/intern/writeffmpeg.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/writeffmpeg.c	2011-05-26 21:04:01 UTC (rev 36933)
+++ trunk/blender/source/blender/blenkernel/intern/writeffmpeg.c	2011-05-26 21:57:02 UTC (rev 36934)
@@ -39,19 +39,6 @@
 #include <libswscale/swscale.h>
 #include <libavcodec/opt.h>
 
-#if LIBAVFORMAT_VERSION_INT < (49 << 16)
-#define FFMPEG_OLD_FRAME_RATE 1
-#else
-#define FFMPEG_CODEC_IS_POINTER 1
-#define FFMPEG_CODEC_TIME_BASE  1
-#endif
-
-#if LIBAVFORMAT_VERSION_INT >= (52 << 16)
-#define OUTFILE_PB (outfile->pb)
-#else
-#define OUTFILE_PB (&outfile->pb)
-#endif
-
 #if defined(WIN32) && (!(defined snprintf))
 #define snprintf _snprintf
 #endif
@@ -114,24 +101,12 @@
 	}
 }
 
-#ifdef FFMPEG_CODEC_IS_POINTER
-static AVCodecContext* get_codec_from_stream(AVStream* stream)
-{
-	return stream->codec;
-}
-#else
-static AVCodecContext* get_codec_from_stream(AVStream* stream)
-{
-	return &stream->codec;
-}
-#endif
-
 static int write_audio_frame(void) 
 {
 	AVCodecContext* c = NULL;
 	AVPacket pkt;
 
-	c = get_codec_from_stream(audio_stream);
+	c = audio_stream->codec;
 
 	av_init_packet(&pkt);
 	pkt.size = 0;
@@ -153,17 +128,15 @@
 
 	if(c->coded_frame && c->coded_frame->pts != AV_NOPTS_VALUE)
 	{
-#ifdef FFMPEG_CODEC_TIME_BASE
 		pkt.pts = av_rescale_q(c->coded_frame->pts,
-					   c->time_base, audio_stream->time_base);
-#else
-		pkt.pts = c->coded_frame->pts;
-#endif
+				       c->time_base, audio_stream->time_base);
 		fprintf(stderr, "Audio Frame PTS: %d\n", (int)pkt.pts);
 	}
 
 	pkt.stream_index = audio_stream->index;
-	pkt.flags |= PKT_FLAG_KEY;
+
+	pkt.flags |= AV_PKT_FLAG_KEY;
+
 	if (av_interleaved_write_frame(outfile, &pkt) != 0) {
 		fprintf(stderr, "Error writing audio packet!\n");
 		return -1;
@@ -263,10 +236,10 @@
 {
 	int outsize = 0;
 	int ret, success= 1;
-	AVCodecContext* c = get_codec_from_stream(video_stream);
-#ifdef FFMPEG_CODEC_TIME_BASE
+	AVCodecContext* c = video_stream->codec;
+
 	frame->pts = rd->cfra - rd->sfra;
-#endif
+
 	if (rd->mode & R_FIELDS) {
 		frame->top_field_first = ((rd->mode & R_ODDFIELD) != 0);
 	}
@@ -278,19 +251,15 @@
 		av_init_packet(&packet);
 
 		if (c->coded_frame->pts != AV_NOPTS_VALUE) {
-#ifdef FFMPEG_CODEC_TIME_BASE
 			packet.pts = av_rescale_q(c->coded_frame->pts,
 						  c->time_base,
 						  video_stream->time_base);
-#else
-			packet.pts = c->coded_frame->pts;
-#endif
 			fprintf(stderr, "Video Frame PTS: %d\n", (int)packet.pts);
 		} else {
 			fprintf(stderr, "Video Frame PTS: not set\n");
 		}
 		if (c->coded_frame->key_frame)
-			packet.flags |= PKT_FLAG_KEY;
+			packet.flags |= AV_PKT_FLAG_KEY;
 		packet.stream_index = video_stream->index;
 		packet.data = video_buffer;
 		packet.size = outsize;
@@ -312,7 +281,7 @@
 {
 	uint8_t* rendered_frame;
 
-	AVCodecContext* c = get_codec_from_stream(video_stream);
+	AVCodecContext* c = video_stream->codec;
 	int width = c->width;
 	int height = c->height;
 	AVFrame* rgb_frame;
@@ -396,7 +365,7 @@
 	switch(prop->type) {
 	case IDP_STRING:
 		fprintf(stderr, "%s.\n", IDP_String(prop));
-		rv = av_set_string(c, prop->name, IDP_String(prop));
+		av_set_string3(c, prop->name, IDP_String(prop), 1, &rv);
 		break;
 	case IDP_FLOAT:
 		fprintf(stderr, "%g.\n", IDP_Float(prop));
@@ -407,7 +376,7 @@
 		
 		if (param) {
 			if (IDP_Int(prop)) {
-				rv = av_set_string(c, name, param);
+				av_set_string3(c, name, param, 1, &rv);
 			} else {
 				return;
 			}
@@ -459,9 +428,9 @@
 
 	/* Set up the codec context */
 	
-	c = get_codec_from_stream(st);
+	c = st->codec;
 	c->codec_id = codec_id;
-	c->codec_type = CODEC_TYPE_VIDEO;
+	c->codec_type = AVMEDIA_TYPE_VIDEO;
 
 
 	/* Get some values from the current render settings */
@@ -469,7 +438,6 @@
 	c->width = rectx;
 	c->height = recty;
 
-#ifdef FFMPEG_CODEC_TIME_BASE
 	/* FIXME: Really bad hack (tm) for NTSC support */
 	if (ffmpeg_type == FFMPEG_DV && rd->frs_sec != 25) {
 		c->time_base.den = 2997;
@@ -482,20 +450,6 @@
 		c->time_base.den = rd->frs_sec * 100000;
 		c->time_base.num = ((double) rd->frs_sec_base) * 100000;
 	}
-#else
-	/* FIXME: Really bad hack (tm) for NTSC support */
-	if (ffmpeg_type == FFMPEG_DV && rd->frs_sec != 25) {
-		c->frame_rate = 2997;
-		c->frame_rate_base = 100;
-	} else if ((double) ((int) rd->frs_sec_base) == 
-		   rd->frs_sec_base) {
-		c->frame_rate = rd->frs_sec;
-		c->frame_rate_base = rd->frs_sec_base;
-	} else {
-		c->frame_rate = rd->frs_sec * 100000;
-		c->frame_rate_base = ((double) rd->frs_sec_base)*100000;
-	}
-#endif
 	
 	c->gop_size = ffmpeg_gop_size;
 	c->bit_rate = ffmpeg_video_bitrate*1000;
@@ -519,7 +473,7 @@
 		c->pix_fmt = PIX_FMT_YUV422P;
 	}
 
-	if (codec_id == CODEC_ID_XVID) {
+	if (ffmpeg_type == FFMPEG_XVID) {
 		/* arghhhh ... */
 		c->pix_fmt = PIX_FMT_YUV420P;
 		c->codec_tag = (('D'<<24) + ('I'<<16) + ('V'<<8) + 'X');
@@ -586,9 +540,9 @@
 	st = av_new_stream(of, 1);
 	if (!st) return NULL;
 
-	c = get_codec_from_stream(st);
+	c = st->codec;
 	c->codec_id = codec_id;
-	c->codec_type = CODEC_TYPE_AUDIO;
+	c->codec_type = AVMEDIA_TYPE_AUDIO;
 
 	c->sample_rate = rd->ffcodecdata.audio_mixrate;
 	c->bit_rate = ffmpeg_audio_bitrate*1000;
@@ -666,13 +620,13 @@
 		BKE_report(reports, RPT_ERROR, "No valid formats found.");
 		return 0;
 	}
-	fmt = guess_format(NULL, exts[0], NULL);
+	fmt = av_guess_format(NULL, exts[0], NULL);
 	if (!fmt) {
 		BKE_report(reports, RPT_ERROR, "No valid formats found.");
 		return 0;
 	}
 
-	of = av_alloc_format_context();
+	of = avformat_alloc_context();
 	if (!of) {
 		BKE_report(reports, RPT_ERROR, "Error opening output file");
 		return 0;
@@ -713,7 +667,7 @@
 		fmt->video_codec = CODEC_ID_H264;
 		break;
 	case FFMPEG_XVID:
-		fmt->video_codec = CODEC_ID_XVID;
+		fmt->video_codec = CODEC_ID_MPEG4;
 		break;
 	case FFMPEG_FLV:
 		fmt->video_codec = CODEC_ID_FLV1;
@@ -772,7 +726,7 @@
 		return 0;
 	}
 	if (!(fmt->flags & AVFMT_NOFILE)) {
-		if (url_fopen(&of->pb, name, URL_WRONLY) < 0) {
+		if (avio_open(&of->pb, name, AVIO_FLAG_WRITE) < 0) {
 			BKE_report(reports, RPT_ERROR, "Could not open file for writing.");
 			return 0;
 		}
@@ -780,7 +734,7 @@
 
 	av_write_header(of);
 	outfile = of;
-	dump_format(of, 0, name, 1);
+	av_dump_format(of, 0, name, 1);
 
 	return 1;
 }
@@ -807,7 +761,7 @@
 	int outsize = 0;
 	int ret = 0;
 	
-	AVCodecContext* c = get_codec_from_stream(video_stream);
+	AVCodecContext* c = video_stream->codec;
 	/* get the delayed frames */
 	while (1) {
 		AVPacket packet;
@@ -822,19 +776,15 @@
 			break;
 		}
 		if (c->coded_frame->pts != AV_NOPTS_VALUE) {
-#ifdef FFMPEG_CODEC_TIME_BASE
 			packet.pts = av_rescale_q(c->coded_frame->pts,
 						  c->time_base,
 						  video_stream->time_base);
-#else
-			packet.pts = c->coded_frame->pts;
-#endif
 			fprintf(stderr, "Video Frame PTS: %d\n", (int)packet.pts);
 		} else {
 			fprintf(stderr, "Video Frame PTS: not set\n");
 		}
 		if (c->coded_frame->key_frame) {
-			packet.flags |= PKT_FLAG_KEY;
+			packet.flags |= AV_PKT_FLAG_KEY;
 		}
 		packet.stream_index = video_stream->index;
 		packet.data = video_buffer;
@@ -845,7 +795,7 @@
 			break;
 		}
 	}
-	avcodec_flush_buffers(get_codec_from_stream(video_stream));
+	avcodec_flush_buffers(video_stream->codec);
 }
 
 /* **********************************************************************
@@ -902,7 +852,7 @@
 
 	if(audio_stream)
 	{
-		AVCodecContext* c = get_codec_from_stream(audio_stream);
+		AVCodecContext* c = audio_stream->codec;
 		AUD_DeviceSpecs specs;
 		specs.channels = c->channels;
 		specs.format = AUD_FORMAT_S16;
@@ -945,7 +895,7 @@
 		success= (avframe && write_video_frame(rd, avframe, reports));
 
 		if (ffmpeg_autosplit) {
-			if (url_ftell(OUTFILE_PB) > FFMPEG_AUTOSPLIT_SIZE) {
+			if (avio_tell(outfile->pb) > FFMPEG_AUTOSPLIT_SIZE) {
 				end_ffmpeg();
 				ffmpeg_autosplit_count++;
 				success &= start_ffmpeg_impl(rd, rectx, recty, reports);
@@ -974,7 +924,7 @@
 		audio_mixdown_device = 0;
 	}
 	
-	if (video_stream && get_codec_from_stream(video_stream)) {
+	if (video_stream && video_stream->codec) {
 		fprintf(stderr, "Flushing delayed frames...\n");
 		flush_ffmpeg ();		
 	}
@@ -985,8 +935,8 @@
 	
 	/* Close the video codec */
 
-	if (video_stream && get_codec_from_stream(video_stream)) {
-		avcodec_close(get_codec_from_stream(video_stream));
+	if (video_stream && video_stream->codec) {
+		avcodec_close(video_stream->codec);
 		printf("zero video stream %p\n", video_stream);
 		video_stream = 0;
 	}
@@ -1007,7 +957,7 @@
 	}
 	if (outfile && outfile->oformat) {
 		if (!(outfile->oformat->flags & AVFMT_NOFILE)) {
-			url_fclose(OUTFILE_PB);
+			avio_close(outfile->pb);
 		}
 	}
 	if (outfile) {
@@ -1101,12 +1051,12 @@
 	switch (o->type) {
 	case FF_OPT_TYPE_INT:
 	case FF_OPT_TYPE_INT64:
-		val.i = o->default_val;
+		val.i = o->default_val.i64;
 		idp_type = IDP_INT;
 		break;
 	case FF_OPT_TYPE_DOUBLE:
 	case FF_OPT_TYPE_FLOAT:
-		val.f = o->default_val;
+		val.f = o->default_val.dbl;
 		idp_type = IDP_FLOAT;
 		break;
 	case FF_OPT_TYPE_STRING:
@@ -1314,7 +1264,7 @@

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list