[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13740] trunk/blender/source/blender/src/ hddaudio.c: == Sequencer / FFMPEG ==

Peter Schlaile peter at schlaile.de
Mon Feb 18 00:39:20 CET 2008


Revision: 13740
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13740
Author:   schlaile
Date:     2008-02-18 00:39:16 +0100 (Mon, 18 Feb 2008)

Log Message:
-----------
== Sequencer / FFMPEG ==

This fixes [#8297] Video Playback crash (audio buffer) 
If a single audio frame is larger than 1 second (but still smaller than
AVCODEC_MAX_AUDIO_FRAME_SIZE) things could get very - annoying :)

Modified Paths:
--------------
    trunk/blender/source/blender/src/hddaudio.c

Modified: trunk/blender/source/blender/src/hddaudio.c
===================================================================
--- trunk/blender/source/blender/src/hddaudio.c	2008-02-17 22:42:03 UTC (rev 13739)
+++ trunk/blender/source/blender/src/hddaudio.c	2008-02-17 23:39:16 UTC (rev 13740)
@@ -283,58 +283,61 @@
 		
 		decode_pos -= bl_size;
 
-		memset(hdaudio->decode_cache + decode_pos, 0,
-		       (hdaudio->decode_cache_size - decode_pos) 
-		       * sizeof(short));
-		       
+		if (decode_pos < hdaudio->decode_cache_size) {
+			memset(hdaudio->decode_cache + decode_pos, 0,
+			       (hdaudio->decode_cache_size - decode_pos) 
+			       * sizeof(short));
 
-		while(av_read_frame(hdaudio->pFormatCtx, &packet) >= 0) {
-			int data_size;
-			int len;
-			uint8_t *audio_pkt_data;
-			int audio_pkt_size;
+			while(av_read_frame(
+				      hdaudio->pFormatCtx, &packet) >= 0) {
+				int data_size;
+				int len;
+				uint8_t *audio_pkt_data;
+				int audio_pkt_size;
+				
+				if(packet.stream_index 
+				   != hdaudio->audioStream) {
+					av_free_packet(&packet);
+					continue;
+				}
 
-			if(packet.stream_index != hdaudio->audioStream) {
-				av_free_packet(&packet);
-				continue;
-			}
+				audio_pkt_data = packet.data;
+				audio_pkt_size = packet.size;
 
-			audio_pkt_data = packet.data;
-			audio_pkt_size = packet.size;
-
-			while (audio_pkt_size > 0) {
-				len = avcodec_decode_audio(
-					hdaudio->pCodecCtx, 
-					hdaudio->decode_cache 
-					+ decode_pos, 
-					&data_size, 
-					audio_pkt_data, 
-					audio_pkt_size);
-				if (len <= 0) {
-					audio_pkt_size = 0;
-					break;
+				while (audio_pkt_size > 0) {
+					len = avcodec_decode_audio(
+						hdaudio->pCodecCtx, 
+						hdaudio->decode_cache 
+						+ decode_pos, 
+						&data_size, 
+						audio_pkt_data, 
+						audio_pkt_size);
+					if (len <= 0) {
+						audio_pkt_size = 0;
+						break;
+					}
+					
+					audio_pkt_size -= len;
+					audio_pkt_data += len;
+					
+					if (data_size <= 0) {
+						continue;
+					}
+					
+					decode_pos += data_size / sizeof(short);
+					if (decode_pos + data_size
+					    / sizeof(short)
+					    > hdaudio->decode_cache_size) {
+						break;
+					}
 				}
+				av_free_packet(&packet);
 				
-				audio_pkt_size -= len;
-				audio_pkt_data += len;
-
-				if (data_size <= 0) {
-					continue;
-				}
-				
-				decode_pos += data_size / sizeof(short);
-				if (decode_pos + data_size
-				    / sizeof(short)
+				if (decode_pos + data_size / sizeof(short)
 				    > hdaudio->decode_cache_size) {
 					break;
 				}
 			}
-			av_free_packet(&packet);
-
-			if (decode_pos + data_size / sizeof(short)
-			    > hdaudio->decode_cache_size) {
-				break;
-			}
 		}
 
 		if (rate_conversion) {





More information about the Bf-blender-cvs mailing list