[packages/tvheadend] - updated to 4.0.8 - fixed building with ffmepg 3.x based on upstream https://tvheadend.org/projects
baggins
baggins at pld-linux.org
Sat Apr 16 19:55:48 CEST 2016
commit 1b264c5023662c328ee9e69627888611fdd310ca
Author: Jan Rękorajski <baggins at pld-linux.org>
Date: Sat Apr 16 19:55:13 2016 +0200
- updated to 4.0.8
- fixed building with ffmepg 3.x based on upstream https://tvheadend.org/projects/tvheadend/repository/revisions/c63371c8bf51928a6c965bdf17dd73555b7b9d54/diff/
ffmpeg3.patch | 445 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tvheadend.spec | 8 +-
2 files changed, 450 insertions(+), 3 deletions(-)
---
diff --git a/tvheadend.spec b/tvheadend.spec
index 7f7d980..8243501 100644
--- a/tvheadend.spec
+++ b/tvheadend.spec
@@ -1,17 +1,18 @@
Summary: TV streaming server
Name: tvheadend
# https://tvheadend.org/projects/tvheadend/wiki/Releases
-Version: 4.0.2
+Version: 4.0.8
Release: 1
License: GPL v3
Group: Applications/Multimedia
-Source0: https://github.com/tvheadend/tvheadend/archive/v%{version}.tar.gz
-# Source0-md5: e17596adbfde2a9893460264037278e4
+Source0: https://github.com/tvheadend/tvheadend/archive/v%{version}/%{name}-%{version}.tar.gz
+# Source0-md5: dbb33a9b27a68749961f6aae700d9848
Source1: %{name}.conf
Source2: %{name}.service
Source3: %{name}.sysconfig
Source4: %{name}.init
Patch0: x32.patch
+Patch1: ffmpeg3.patch
URL: https://tvheadend.org/projects/tvheadend
BuildRequires: avahi-devel
BuildRequires: curl-devel
@@ -39,6 +40,7 @@ DVB-C, DVB-T, ATSC, IPTV, and Analog video (V4L) as input sources.
%prep
%setup -q
%patch0 -p1
+%patch1 -p1
%build
export CFLAGS="%{rpmcflags}"
diff --git a/ffmpeg3.patch b/ffmpeg3.patch
new file mode 100644
index 0000000..910a102
--- /dev/null
+++ b/ffmpeg3.patch
@@ -0,0 +1,445 @@
+diff -ur tvheadend-4.0.8.orig/configure tvheadend-4.0.8/configure
+--- tvheadend-4.0.8.orig/configure 2015-12-16 18:33:33.000000000 +0100
++++ tvheadend-4.0.8/configure 2016-04-16 19:41:41.685840403 +0200
+@@ -395,7 +395,7 @@
+ has_libav=false
+ fi
+
+- if $has_libav && ! check_pkg libswscale ">=2.3.100"; then
++ if $has_libav && ! check_pkg libavfilter ">=4.0.0"; then
+ has_libav=false
+ fi
+
+@@ -421,7 +421,7 @@
+ has_libav=false
+ fi
+
+- if $has_libav && ! check_pkg libswscale ">=2.1.2"; then
++ if $has_libav && ! check_pkg libavfilter ">=4.0.0"; then
+ has_libav=false
+ fi
+
+diff -ur tvheadend-4.0.8.orig/Makefile tvheadend-4.0.8/Makefile
+--- tvheadend-4.0.8.orig/Makefile 2015-12-16 18:33:33.000000000 +0100
++++ tvheadend-4.0.8/Makefile 2016-04-16 19:41:41.685840403 +0200
+@@ -60,7 +60,7 @@
+ LDFLAGS_FFDIR = ${ROOTDIR}/libav_static/build/ffmpeg/lib
+ LDFLAGS += ${LDFLAGS_FFDIR}/libavresample.a
+ LDFLAGS += ${LDFLAGS_FFDIR}/libswresample.a
+-LDFLAGS += ${LDFLAGS_FFDIR}/libswscale.a
++LDFLAGS += ${LDFLAGS_FFDIR}/libavfilter.a
+ LDFLAGS += ${LDFLAGS_FFDIR}/libavutil.a
+ LDFLAGS += ${LDFLAGS_FFDIR}/libavformat.a
+ LDFLAGS += ${LDFLAGS_FFDIR}/libavcodec.a
+diff -ur tvheadend-4.0.8.orig/Makefile.ffmpeg tvheadend-4.0.8/Makefile.ffmpeg
+--- tvheadend-4.0.8.orig/Makefile.ffmpeg 2015-12-16 18:33:33.000000000 +0100
++++ tvheadend-4.0.8/Makefile.ffmpeg 2016-04-16 19:41:41.685840403 +0200
+@@ -60,7 +60,7 @@
+ FFMPEG_SHA1 = 65470c9b967485f72f81758a7bad44cf7a1763db
+
+ EXTLIBS = libx264 libvorbis libvpx
+-COMPONENTS = avutil avformat avcodec swresample swscale avresample
++COMPONENTS = avutil avformat avcodec swresample avfilter avresample
+ PROTOCOLS = file
+ DECODERS = mpeg2video mp2 ac3 eac3 h264 h264_vdpau aac aac_latm vorbis libvorbis
+ ENCODERS = mpeg2video mp2 libx264 libvpx_vp8 libvpx_vp9 aac libaacplus vorbis libvorbis
+diff -ur tvheadend-4.0.8.orig/src/libav.c tvheadend-4.0.8/src/libav.c
+--- tvheadend-4.0.8.orig/src/libav.c 2015-12-16 18:33:33.000000000 +0100
++++ tvheadend-4.0.8/src/libav.c 2016-04-16 19:44:03.666521276 +0200
+@@ -186,4 +186,5 @@
+ av_log_set_callback(libav_log_callback);
+ av_log_set_level(AV_LOG_VERBOSE);
+ av_register_all();
++ avfilter_register_all();
+ }
+diff -ur tvheadend-4.0.8.orig/src/libav.h tvheadend-4.0.8/src/libav.h
+--- tvheadend-4.0.8.orig/src/libav.h 2015-12-16 18:33:33.000000000 +0100
++++ tvheadend-4.0.8/src/libav.h 2016-04-16 19:41:41.685840403 +0200
+@@ -21,6 +21,7 @@
+
+
+ #include <libavformat/avformat.h>
++#include <libavfilter/avfilter.h>
+ #include "tvheadend.h"
+
+ /*
+diff -ur tvheadend-4.0.8.orig/src/plumbing/transcoding.c tvheadend-4.0.8/src/plumbing/transcoding.c
+--- tvheadend-4.0.8.orig/src/plumbing/transcoding.c 2015-12-16 18:33:33.000000000 +0100
++++ tvheadend-4.0.8/src/plumbing/transcoding.c 2016-04-16 19:53:13.907273675 +0200
+@@ -19,12 +19,14 @@
+ #include <unistd.h>
+ #include <libavformat/avformat.h>
+ #include <libavcodec/avcodec.h>
+-#include <libswscale/swscale.h>
++#include <libavfilter/avfiltergraph.h>
++#include <libavfilter/buffersink.h>
++#include <libavfilter/buffersrc.h>
++#include <libavutil/opt.h>
+ #include <libavresample/avresample.h>
+ #include <libavutil/opt.h>
+ #include <libavutil/audio_fifo.h>
+ #include <libavutil/dict.h>
+-#include <libavutil/audioconvert.h>
+
+ #if LIBAVUTIL_VERSION_MICRO >= 100 /* FFMPEG */
+ #define USING_FFMPEG 1
+@@ -91,9 +93,12 @@
+ AVCodec *vid_ocodec;
+
+ AVFrame *vid_dec_frame;
+- struct SwsContext *vid_scaler;
+ AVFrame *vid_enc_frame;
+
++ AVFilterGraph *flt_graph;
++ AVFilterContext *flt_bufsrcctx;
++ AVFilterContext *flt_bufsinkctx;
++
+ int16_t vid_width;
+ int16_t vid_height;
+
+@@ -592,10 +597,10 @@
+ // Convert audio
+ tvhtrace("transcode", "%04X: converting audio", shortid(t));
+
+- tvhtrace("transcode", "%04X: IN : channels=%d, layout=%" PRIi64 ", rate=%d, fmt=%d, bitrate=%d",
++ tvhtrace("transcode", "%04X: IN : channels=%d, layout=%" PRIi64 ", rate=%d, fmt=%d, bitrate=%ld",
+ shortid(t), ictx->channels, ictx->channel_layout, ictx->sample_rate,
+ ictx->sample_fmt, ictx->bit_rate);
+- tvhtrace("transcode", "%04X: OUT: channels=%d, layout=%" PRIi64 ", rate=%d, fmt=%d, bitrate=%d",
++ tvhtrace("transcode", "%04X: OUT: channels=%d, layout=%" PRIi64 ", rate=%d, fmt=%d, bitrate=%ld",
+ shortid(t), octx->channels, octx->channel_layout, octx->sample_rate,
+ octx->sample_fmt, octx->bit_rate);
+
+@@ -952,6 +957,114 @@
+
+ }
+
++/* create a simple deinterlacer-scaler video filter chain */
++static int
++create_video_filter(video_stream_t *vs, transcoder_t *t,
++ AVCodecContext *ictx, AVCodecContext *octx)
++{
++ AVFilterInOut *flt_inputs, *flt_outputs;
++ AVFilter *flt_bufsrc, *flt_bufsink;
++ char opt[128];
++ int err;
++
++ err = 1;
++ flt_inputs = flt_outputs = NULL;
++ flt_bufsrc = flt_bufsink = NULL;
++
++ if (vs->flt_graph)
++ avfilter_graph_free(&vs->flt_graph);
++
++ vs->flt_graph = avfilter_graph_alloc();
++ if (!vs->flt_graph)
++ return err;
++
++ flt_inputs = avfilter_inout_alloc();
++ if (!flt_inputs)
++ goto out_err;
++
++ flt_outputs = avfilter_inout_alloc();
++ if (!flt_outputs)
++ goto out_err;
++
++ flt_bufsrc = avfilter_get_by_name("buffer");
++ flt_bufsink = avfilter_get_by_name("buffersink");
++ if (!flt_bufsrc || !flt_bufsink) {
++ tvherror("transcode", "%04X: libav default buffers unknown", shortid(t));
++ goto out_err;
++ }
++
++ memset(opt, 0, sizeof(opt));
++ snprintf(opt, sizeof(opt), "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
++ ictx->width,
++ ictx->height,
++ ictx->pix_fmt,
++ ictx->time_base.num,
++ ictx->time_base.den,
++ ictx->sample_aspect_ratio.num,
++ ictx->sample_aspect_ratio.den);
++
++ err = avfilter_graph_create_filter(&vs->flt_bufsrcctx, flt_bufsrc, "in",
++ opt, NULL, vs->flt_graph);
++ if (err < 0) {
++ tvherror("transcode", "%04X: fltchain IN init error", shortid(t));
++ goto out_err;
++ }
++
++ err = avfilter_graph_create_filter(&vs->flt_bufsinkctx, flt_bufsink,
++ "out", NULL, NULL, vs->flt_graph);
++ if (err < 0) {
++ tvherror("transcode", "%04X: fltchain OUT init error", shortid(t));
++ goto out_err;
++ }
++
++ flt_outputs->name = av_strdup("in");
++ flt_outputs->filter_ctx = vs->flt_bufsrcctx;
++ flt_outputs->pad_idx = 0;
++ flt_outputs->next = NULL;
++ flt_inputs->name = av_strdup("out");
++ flt_inputs->filter_ctx = vs->flt_bufsinkctx;
++ flt_inputs->pad_idx = 0;
++ flt_inputs->next = NULL;
++
++ /* add filters: yadif to deinterlace and a scaler */
++ memset(opt, 0, sizeof(opt));
++ snprintf(opt, sizeof(opt), "yadif,scale=%dx%d",
++ octx->width,
++ octx->height);
++ err = avfilter_graph_parse_ptr(vs->flt_graph,
++ opt,
++ &flt_inputs,
++ &flt_outputs,
++ NULL);
++ if (err < 0) {
++ tvherror("transcode", "%04X: failed to init filter chain", shortid(t));
++ goto out_err;
++ }
++
++ err = avfilter_graph_config(vs->flt_graph, NULL);
++ if (err < 0) {
++ tvherror("transcode", "%04X: failed to config filter chain", shortid(t));
++ goto out_err;
++ }
++
++ avfilter_inout_free(&flt_inputs);
++ avfilter_inout_free(&flt_outputs);
++
++ return 0; /* all OK */
++
++out_err:
++ if (flt_inputs)
++ avfilter_inout_free(&flt_inputs);
++ if (flt_outputs)
++ avfilter_inout_free(&flt_outputs);
++ if (vs->flt_graph) {
++ avfilter_graph_free(&vs->flt_graph);
++ vs->flt_graph = NULL;
++ }
++
++ return err;
++}
++
+ /**
+ *
+ */
+@@ -962,9 +1075,7 @@
+ AVCodecContext *ictx, *octx;
+ AVDictionary *opts;
+ AVPacket packet, packet2;
+- AVPicture deint_pic;
+- uint8_t *buf, *deint;
+- int length, len, ret, got_picture, got_output, got_ref;
++ int length, ret, got_picture, got_output, got_ref;
+ video_stream_t *vs = (video_stream_t*)ts;
+ streaming_message_t *sm;
+ th_pkt_t *pkt2;
+@@ -980,7 +1091,6 @@
+ icodec = vs->vid_icodec;
+ ocodec = vs->vid_ocodec;
+
+- buf = deint = NULL;
+ opts = NULL;
+
+ got_ref = 0;
+@@ -1061,7 +1171,7 @@
+ switch (ts->ts_type) {
+ case SCT_MPEG2VIDEO:
+ octx->codec_id = AV_CODEC_ID_MPEG2VIDEO;
+- octx->pix_fmt = PIX_FMT_YUV420P;
++ octx->pix_fmt = AV_PIX_FMT_YUV420P;
+ octx->flags |= CODEC_FLAG_GLOBAL_HEADER;
+
+ // Default settings for quantizer. Best quality unless changed by the streaming profile.
+@@ -1089,7 +1199,7 @@
+
+ case SCT_VP8:
+ octx->codec_id = AV_CODEC_ID_VP8;
+- octx->pix_fmt = PIX_FMT_YUV420P;
++ octx->pix_fmt = AV_PIX_FMT_YUV420P;
+
+ av_dict_set(&opts, "quality", "realtime", 0);
+
+@@ -1120,7 +1230,7 @@
+
+ case SCT_H264:
+ octx->codec_id = AV_CODEC_ID_H264;
+- octx->pix_fmt = PIX_FMT_YUV420P;
++ octx->pix_fmt = AV_PIX_FMT_YUV420P;
+ octx->flags |= CODEC_FLAG_GLOBAL_HEADER;
+
+ // Qscale difference between I-frames and P-frames.
+@@ -1177,79 +1287,53 @@
+ transcoder_stream_invalidate(ts);
+ goto cleanup;
+ }
+- }
+
+- len = avpicture_get_size(ictx->pix_fmt, ictx->width, ictx->height);
+- deint = av_malloc(len);
+-
+- avpicture_fill(&deint_pic,
+- deint,
+- ictx->pix_fmt,
+- ictx->width,
+- ictx->height);
+-
+- if (avpicture_deinterlace(&deint_pic,
+- (AVPicture *)vs->vid_dec_frame,
+- ictx->pix_fmt,
+- ictx->width,
+- ictx->height) < 0) {
+- tvherror("transcode", "%04X: Cannot deinterlace frame", shortid(t));
+- transcoder_stream_invalidate(ts);
+- goto cleanup;
++ if (create_video_filter(vs, t, ictx, octx)) {
++ tvherror("transcode", "%04X: Video filter creation failed",
++ shortid(t));
++ transcoder_stream_invalidate(ts);
++ goto cleanup;
++ }
+ }
+
+- len = avpicture_get_size(octx->pix_fmt, octx->width, octx->height);
+- buf = av_malloc(len + FF_INPUT_BUFFER_PADDING_SIZE);
+- memset(buf, 0, len);
+-
+- avpicture_fill((AVPicture *)vs->vid_enc_frame,
+- buf,
+- octx->pix_fmt,
+- octx->width,
+- octx->height);
+-
+- vs->vid_scaler = sws_getCachedContext(vs->vid_scaler,
+- ictx->width,
+- ictx->height,
+- ictx->pix_fmt,
+- octx->width,
+- octx->height,
+- octx->pix_fmt,
+- 1,
+- NULL,
+- NULL,
+- NULL);
+-
+- if (sws_scale(vs->vid_scaler,
+- (const uint8_t * const*)deint_pic.data,
+- deint_pic.linesize,
+- 0,
+- ictx->height,
+- vs->vid_enc_frame->data,
+- vs->vid_enc_frame->linesize) < 0) {
+- tvherror("transcode", "%04X: Cannot scale frame", shortid(t));
++ /* push decoded frame into filter chain */
++ if (av_buffersrc_add_frame(vs->flt_bufsrcctx, vs->vid_dec_frame) < 0) {
++ tvherror("transcode", "%04X: filter input error", shortid(t));
+ transcoder_stream_invalidate(ts);
+ goto cleanup;
+ }
+
+- vs->vid_enc_frame->format = octx->pix_fmt;
+- vs->vid_enc_frame->width = octx->width;
+- vs->vid_enc_frame->height = octx->height;
+-
+- vs->vid_enc_frame->pkt_pts = vs->vid_dec_frame->pkt_pts;
+- vs->vid_enc_frame->pkt_dts = vs->vid_dec_frame->pkt_dts;
+-
+- if (vs->vid_dec_frame->reordered_opaque != AV_NOPTS_VALUE)
+- vs->vid_enc_frame->pts = vs->vid_dec_frame->reordered_opaque;
+-
+- else if (ictx->coded_frame && ictx->coded_frame->pts != AV_NOPTS_VALUE)
+- vs->vid_enc_frame->pts = vs->vid_dec_frame->pts;
+-
+- ret = avcodec_encode_video2(octx, &packet2, vs->vid_enc_frame, &got_output);
+- if (ret < 0) {
+- tvherror("transcode", "%04X: Error encoding frame", shortid(t));
+- transcoder_stream_invalidate(ts);
+- goto cleanup;
++ /* and pull out a filtered frame */
++ while (1) {
++ ret = av_buffersink_get_frame(vs->flt_bufsinkctx, vs->vid_enc_frame);
++ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
++ break;
++ if (ret < 0) {
++ tvherror("transcode", "%04X: filter output error", shortid(t));
++ transcoder_stream_invalidate(ts);
++ goto cleanup;
++ }
++
++ vs->vid_enc_frame->format = octx->pix_fmt;
++ vs->vid_enc_frame->width = octx->width;
++ vs->vid_enc_frame->height = octx->height;
++
++ vs->vid_enc_frame->pkt_pts = vs->vid_dec_frame->pkt_pts;
++ vs->vid_enc_frame->pkt_dts = vs->vid_dec_frame->pkt_dts;
++
++ if (vs->vid_dec_frame->reordered_opaque != AV_NOPTS_VALUE)
++ vs->vid_enc_frame->pts = vs->vid_dec_frame->reordered_opaque;
++
++ else if (ictx->coded_frame && ictx->coded_frame->pts != AV_NOPTS_VALUE)
++ vs->vid_enc_frame->pts = vs->vid_dec_frame->pts;
++
++ ret = avcodec_encode_video2(octx, &packet2, vs->vid_enc_frame, &got_output);
++ if (ret < 0) {
++ tvherror("transcode", "%04X: Error encoding frame", shortid(t));
++ transcoder_stream_invalidate(ts);
++ goto cleanup;
++ }
++ av_frame_unref(vs->vid_enc_frame);
+ }
+
+ if (got_output)
+@@ -1263,12 +1347,6 @@
+
+ av_free_packet(&packet);
+
+- if(buf)
+- av_free(buf);
+-
+- if(deint)
+- av_free(deint);
+-
+ if(opts)
+ av_dict_free(&opts);
+
+@@ -1548,15 +1626,17 @@
+ if(vs->vid_dec_frame)
+ av_free(vs->vid_dec_frame);
+
+- if(vs->vid_scaler)
+- sws_freeContext(vs->vid_scaler);
+-
+ if(vs->vid_enc_frame)
+ av_free(vs->vid_enc_frame);
+
+ if (vs->vid_first_pkt)
+ pkt_ref_dec(vs->vid_first_pkt);
+
++ if (vs->flt_graph) {
++ avfilter_graph_free(&vs->flt_graph);
++ vs->flt_graph = NULL;
++ }
++
+ free(ts);
+ }
+
+@@ -1603,11 +1683,13 @@
+ vs->vid_ictx->thread_count =
+ vs->vid_octx->thread_count = transcoder_thread_count(t, sct);
+
+- vs->vid_dec_frame = avcodec_alloc_frame();
+- vs->vid_enc_frame = avcodec_alloc_frame();
++ vs->vid_dec_frame = av_frame_alloc();
++ vs->vid_enc_frame = av_frame_alloc();
++
++ av_frame_unref(vs->vid_dec_frame);
++ av_frame_unref(vs->vid_enc_frame);
+
+- avcodec_get_frame_defaults(vs->vid_dec_frame);
+- avcodec_get_frame_defaults(vs->vid_enc_frame);
++ vs->flt_graph = NULL; /* allocated in packet processor */
+
+ LIST_INSERT_HEAD(&t->t_stream_list, (transcoder_stream_t*)vs, ts_link);
+
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/tvheadend.git/commitdiff/1b264c5023662c328ee9e69627888611fdd310ca
More information about the pld-cvs-commit
mailing list