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;
}