File DVDStyler-ffmpeg7.patch of Package DVDStyler

Index: DVDStyler-3.2.1/src/mediaenc_ffmpeg.cpp
===================================================================
--- DVDStyler-3.2.1.orig/src/mediaenc_ffmpeg.cpp
+++ DVDStyler-3.2.1/src/mediaenc_ffmpeg.cpp
@@ -30,6 +30,7 @@ extern "C" {
 #include <libswscale/swscale.h>
 #include <libavutil/mathematics.h>
 #include <libavutil/avstring.h>
+#include <libavutil/channel_layout.h>
 #include <libavcodec/avcodec.h>
 }
 
@@ -297,8 +298,14 @@ bool wxFfmpegMediaEncoder::addAudioStrea
 	c->bit_rate = 64000;
 	c->sample_rate = 48000;
 	c->sample_fmt = sampleFmt;
-	c->channels = 2;
-	c->channel_layout = AV_CH_LAYOUT_STEREO;
+
+	AVChannelLayout chLayoutStereo;
+	av_channel_layout_default(&chLayoutStereo, 2);
+	if (av_channel_layout_copy(&c->ch_layout, &chLayoutStereo)) {
+		wxLogError("Failed to set 2 channels");
+		return false;
+	}
+
 	if (m_audioStm && avcodec_parameters_from_context(m_audioStm->codecpar, c) < 0) {
 		wxLogError("Failed to copy encoder parameters to output audio stream");
 		return false;
@@ -306,7 +313,7 @@ bool wxFfmpegMediaEncoder::addAudioStrea
 
 	
 	if (avcodec_open2(c, encoder, NULL) < 0) {
-		wxLogError(wxT("Could not open audio codec"));
+		wxLogError("Could not open audio codec");
 		return false;
 	}
 	
@@ -318,7 +325,10 @@ bool wxFfmpegMediaEncoder::addAudioStrea
 
 	m_audioFrame->nb_samples = c->frame_size;
 	m_audioFrame->format = c->sample_fmt;
-	m_audioFrame->channel_layout = c->channel_layout;
+	if (av_channel_layout_copy(&m_audioFrame->ch_layout, &c->ch_layout) < 0) {
+		wxLogError("Could not open copy channel layout");
+		return false;
+	}
 		
 	int ret = av_frame_get_buffer(m_audioFrame, 0); // allocate the data buffers
 	if (ret < 0) {
@@ -328,7 +338,7 @@ bool wxFfmpegMediaEncoder::addAudioStrea
 	ret = av_frame_make_writable(m_audioFrame);
 	if (ret < 0)
 		return false;
-	for (int i = 0; i < c->channels; i++) {
+	for (int i = 0; i < c->ch_layout.nb_channels; i++) {
 		uint16_t *samples = (uint16_t*)m_audioFrame->data[i];
 		memset(samples, 0, c->frame_size * av_get_bytes_per_sample(c->sample_fmt));
 	}
@@ -492,30 +502,29 @@ int encode(AVCodecContext *avctx, AVPack
 }
 
 bool wxFfmpegMediaEncoder::writeAudioFrame() {
-	AVPacket pkt = { 0 }; // data and size must be 0;
-	int got_packet;
-
-	av_init_packet(&pkt);
+	AVPacket* pkt = av_packet_alloc();
 	AVCodecContext *c = m_audioCodec;
 	
 	m_audioFrame->pts = m_nextAudioPts;
 	m_nextAudioPts += m_audioFrame->nb_samples;
-	encode(c, &pkt, m_audioFrame, &got_packet);
+
+	int got_packet = 0;
+	encode(c, pkt, m_audioFrame, &got_packet);
 	if (!got_packet) {
-		av_packet_unref(&pkt);
+		av_packet_unref(pkt);
 		return true;
 	}
 
-	pkt.stream_index = m_audioStm->index; 
+	pkt->stream_index = m_audioStm->index;
 	
 	// write the compressed frame in the media file
-	int ret = av_interleaved_write_frame(m_outputCtx, &pkt);
+	int ret = av_interleaved_write_frame(m_outputCtx, pkt);
 	if (ret < 0) {
-		av_packet_unref(&pkt);
+		av_packet_unref(pkt);
 		print_error("Error while writing audio frame", ret);
 		return false;
 	}
-	av_packet_unref(&pkt);
+	av_packet_unref(pkt);
 	return true;
 }
 
@@ -524,34 +533,33 @@ bool wxFfmpegMediaEncoder::writeVideoFra
 	
 	// encode the image
 	m_picture->pts = m_nextVideoPts++;
-	AVPacket pkt;
-	av_init_packet(&pkt);
-	pkt.data = m_videoOutbuf;
-	pkt.size = VIDEO_BUF_SIZE;
+	AVPacket* pkt = av_packet_alloc();
+	pkt->data = m_videoOutbuf;
+	pkt->size = VIDEO_BUF_SIZE;
 	
 	int got_packet = 0;
-	int ret = encode(c, &pkt, m_picture, &got_packet);
+	int ret = encode(c, pkt, m_picture, &got_packet);
 	if (ret < 0) {
-		av_packet_unref(&pkt);
+		av_packet_unref(pkt);
 		print_error("Error while writing video frame", ret);
 		return false;
 	}
 	if (got_packet) {
-		if (pkt.pts != (int64_t) AV_NOPTS_VALUE)
-			pkt.pts = av_rescale_q(pkt.pts, c->time_base, m_videoStm->time_base);
-		if (pkt.dts != (int64_t) AV_NOPTS_VALUE)
-			pkt.dts = av_rescale_q(pkt.dts, c->time_base, m_videoStm->time_base);
-		pkt.stream_index = m_videoStm->index;
+		if (pkt->pts != (int64_t) AV_NOPTS_VALUE)
+			pkt->pts = av_rescale_q(pkt->pts, c->time_base, m_videoStm->time_base);
+		if (pkt->dts != (int64_t) AV_NOPTS_VALUE)
+			pkt->dts = av_rescale_q(pkt->dts, c->time_base, m_videoStm->time_base);
+		pkt->stream_index = m_videoStm->index;
 		
 		// write the compressed frame in the media file
-		ret = av_interleaved_write_frame(m_outputCtx, &pkt);
+		ret = av_interleaved_write_frame(m_outputCtx, pkt);
 		if (ret < 0) {
-			av_packet_unref(&pkt);
+			av_packet_unref(pkt);
 			print_error("Error while writing video frame", ret);
 			return false;
 		}
 	}
-	av_packet_unref(&pkt);
+	av_packet_unref(pkt);
 	return true;
 }
 
openSUSE Build Service is sponsored by