gnu: Add openscenegraph.

* gnu/packages/graphics.scm (openscenegraph): New variable.
* gnu/packages/patches/openscenegraph-ffmpeg3.patch: New file.
* gnu-system.am (dist_patch_DATA): Add it.
This commit is contained in:
Manolis Ragkousis 2017-06-04 17:46:56 +03:00
parent cc24bf98bd
commit 6bf11392f9
No known key found for this signature in database
GPG Key ID: 327C1EF38DF54C32
3 changed files with 200 additions and 0 deletions

View File

@ -861,6 +861,7 @@ dist_patch_DATA = \
%D%/packages/patches/ocaml-findlib-make-install.patch \ %D%/packages/patches/ocaml-findlib-make-install.patch \
%D%/packages/patches/omake-fix-non-determinism.patch \ %D%/packages/patches/omake-fix-non-determinism.patch \
%D%/packages/patches/ola-readdir-r.patch \ %D%/packages/patches/ola-readdir-r.patch \
%D%/packages/patches/openscenegraph-ffmpeg3.patch \
%D%/packages/patches/openexr-missing-samples.patch \ %D%/packages/patches/openexr-missing-samples.patch \
%D%/packages/patches/openjpeg-CVE-2016-9850-CVE-2016-9851.patch \ %D%/packages/patches/openjpeg-CVE-2016-9850-CVE-2016-9851.patch \
%D%/packages/patches/openjpeg-CVE-2016-9572-CVE-2016-9573.patch \ %D%/packages/patches/openjpeg-CVE-2016-9572-CVE-2016-9573.patch \

View File

@ -5,6 +5,7 @@
;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il> ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
;;; Copyright © 2016 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2016 Andreas Enge <andreas@enge.fr>
;;; Copyright © 2017 Manolis Fragkiskos Ragkousis <manolis837@gmail.com>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -54,6 +55,7 @@
#:use-module (gnu packages image) #:use-module (gnu packages image)
#:use-module (gnu packages jemalloc) #:use-module (gnu packages jemalloc)
#:use-module (gnu packages photo) #:use-module (gnu packages photo)
#:use-module (gnu packages pth)
#:use-module (gnu packages python) #:use-module (gnu packages python)
#:use-module (gnu packages qt) #:use-module (gnu packages qt)
#:use-module (gnu packages readline) #:use-module (gnu packages readline)
@ -318,6 +320,47 @@ visual effects work for film.")
(home-page "http://www.openimageio.org") (home-page "http://www.openimageio.org")
(license license:bsd-3))) (license license:bsd-3)))
(define-public openscenegraph
(package
(name "openscenegraph")
(version "3.4.0")
(source
(origin
(method url-fetch)
(uri (string-append "http://trac.openscenegraph.org/downloads/developer_releases/"
"OpenSceneGraph-" version ".zip"))
(sha256
(base32
"03h4wfqqk7rf3mpz0sa99gy715cwpala7964z2npd8jxfn27swjw"))
(patches (search-patches "openscenegraph-ffmpeg3.patch"))
(file-name (string-append name "-" version ".zip"))))
(build-system cmake-build-system)
(arguments
`(#:tests? #f ;; No test target available.
#:configure-flags
(list (string-append "-DCMAKE_INSTALL_RPATH="
(assoc-ref %outputs "out") "/lib:"
(assoc-ref %outputs "out") "/lib64"))))
(native-inputs
`(("unzip" ,unzip)))
(inputs
`(("giflib", giflib)
("jasper", jasper)
("librsvg", librsvg)
("pth", pth)
("qtbase", qtbase)
("ffmpeg", ffmpeg)
("mesa", mesa)))
(synopsis "High performance real-time graphics toolkit")
(description
"The OpenSceneGraph is an open source high performance 3D graphics toolkit,
used by application developers in fields such as visual simulation, games,
virtual reality, scientific visualization and modelling.")
(home-page "http://www.openscenegraph.org")
;; The 'LICENSE' file explains that the source is licensed under
;; LGPL 2.1, but with 4 exceptions. This version is called OSGPL.
(license license:lgpl2.1)))
(define-public rapicorn (define-public rapicorn
(package (package
(name "rapicorn") (name "rapicorn")

View File

@ -0,0 +1,156 @@
Description: Replace deprecated FFmpeg API
Author: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
See <http://forum.openscenegraph.org/viewtopic.php?t=15832>.
--- a/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp
+++ b/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp
@@ -71,7 +71,7 @@ void FFmpegDecoderVideo::open(AVStream *
findAspectRatio();
// Find out whether we support Alpha channel
- m_alpha_channel = (m_context->pix_fmt == PIX_FMT_YUVA420P);
+ m_alpha_channel = (m_context->pix_fmt == AV_PIX_FMT_YUVA420P);
// Find out the framerate
m_frame_rate = av_q2d(stream->avg_frame_rate);
@@ -91,20 +91,19 @@ void FFmpegDecoderVideo::open(AVStream *
throw std::runtime_error("avcodec_open() failed");
// Allocate video frame
- m_frame.reset(avcodec_alloc_frame());
+ m_frame.reset(av_frame_alloc());
// Allocate converted RGB frame
- m_frame_rgba.reset(avcodec_alloc_frame());
- m_buffer_rgba[0].resize(avpicture_get_size(PIX_FMT_RGB24, width(), height()));
+ m_frame_rgba.reset(av_frame_alloc());
+ m_buffer_rgba[0].resize(avpicture_get_size(AV_PIX_FMT_RGB24, width(), height()));
m_buffer_rgba[1].resize(m_buffer_rgba[0].size());
// Assign appropriate parts of the buffer to image planes in m_frame_rgba
- avpicture_fill((AVPicture *) (m_frame_rgba).get(), &(m_buffer_rgba[0])[0], PIX_FMT_RGB24, width(), height());
+ avpicture_fill((AVPicture *) (m_frame_rgba).get(), &(m_buffer_rgba[0])[0], AV_PIX_FMT_RGB24, width(), height());
// Override get_buffer()/release_buffer() from codec context in order to retrieve the PTS of each frame.
m_context->opaque = this;
- m_context->get_buffer = getBuffer;
- m_context->release_buffer = releaseBuffer;
+ m_context->get_buffer2 = getBuffer;
}
@@ -263,8 +262,8 @@ int FFmpegDecoderVideo::convert(AVPictur
#ifdef USE_SWSCALE
if (m_swscale_ctx==0)
{
- m_swscale_ctx = sws_getContext(src_width, src_height, (PixelFormat) src_pix_fmt,
- src_width, src_height, (PixelFormat) dst_pix_fmt,
+ m_swscale_ctx = sws_getContext(src_width, src_height, (AVPixelFormat) src_pix_fmt,
+ src_width, src_height, (AVPixelFormat) dst_pix_fmt,
/*SWS_BILINEAR*/ SWS_BICUBIC, NULL, NULL, NULL);
}
@@ -311,14 +310,14 @@ void FFmpegDecoderVideo::publishFrame(co
AVPicture * const dst = (AVPicture *) m_frame_rgba.get();
// Assign appropriate parts of the buffer to image planes in m_frame_rgba
- avpicture_fill((AVPicture *) (m_frame_rgba).get(), &(m_buffer_rgba[m_writeBuffer])[0], PIX_FMT_RGB24, width(), height());
+ avpicture_fill((AVPicture *) (m_frame_rgba).get(), &(m_buffer_rgba[m_writeBuffer])[0], AV_PIX_FMT_RGB24, width(), height());
// Convert YUVA420p (i.e. YUV420p plus alpha channel) using our own routine
- if (m_context->pix_fmt == PIX_FMT_YUVA420P)
+ if (m_context->pix_fmt == AV_PIX_FMT_YUVA420P)
yuva420pToRgba(dst, src, width(), height());
else
- convert(dst, PIX_FMT_RGB24, src, m_context->pix_fmt, width(), height());
+ convert(dst, AV_PIX_FMT_RGB24, src, m_context->pix_fmt, width(), height());
// Wait 'delay' seconds before publishing the picture.
int i_delay = static_cast<int>(delay * 1000000 + 0.5);
@@ -345,7 +344,7 @@ void FFmpegDecoderVideo::publishFrame(co
void FFmpegDecoderVideo::yuva420pToRgba(AVPicture * const dst, AVPicture * const src, int width, int height)
{
- convert(dst, PIX_FMT_RGB24, src, m_context->pix_fmt, width, height);
+ convert(dst, AV_PIX_FMT_RGB24, src, m_context->pix_fmt, width, height);
const size_t bpp = 4;
@@ -363,31 +362,28 @@ void FFmpegDecoderVideo::yuva420pToRgba(
}
}
-
-
-int FFmpegDecoderVideo::getBuffer(AVCodecContext * const context, AVFrame * const picture)
+int FFmpegDecoderVideo::getBuffer(AVCodecContext * const context, AVFrame * const picture, int flags)
{
+ AVBufferRef *ref;
const FFmpegDecoderVideo * const this_ = reinterpret_cast<const FFmpegDecoderVideo*>(context->opaque);
- const int result = avcodec_default_get_buffer(context, picture);
+ const int result = avcodec_default_get_buffer2(context, picture, flags);
int64_t * p_pts = reinterpret_cast<int64_t*>( av_malloc(sizeof(int64_t)) );
*p_pts = this_->m_packet_pts;
picture->opaque = p_pts;
+ ref = av_buffer_create((uint8_t *)picture->opaque, sizeof(int64_t), FFmpegDecoderVideo::freeBuffer, picture->buf[0], flags);
+ picture->buf[0] = ref;
+
return result;
}
-
-
-void FFmpegDecoderVideo::releaseBuffer(AVCodecContext * const context, AVFrame * const picture)
+void FFmpegDecoderVideo::freeBuffer(void *opaque, uint8_t *data)
{
- if (picture != 0)
- av_freep(&picture->opaque);
-
- avcodec_default_release_buffer(context, picture);
+ AVBufferRef *ref = (AVBufferRef *)opaque;
+ av_buffer_unref(&ref);
+ av_free(data);
}
-
-
} // namespace osgFFmpeg
--- a/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp
+++ b/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp
@@ -94,8 +94,8 @@ private:
int src_pix_fmt, int src_width, int src_height);
- static int getBuffer(AVCodecContext * context, AVFrame * picture);
- static void releaseBuffer(AVCodecContext * context, AVFrame * picture);
+ static int getBuffer(AVCodecContext * context, AVFrame * picture, int flags);
+ static void freeBuffer(void * opaque, uint8_t *data);
PacketQueue & m_packets;
FFmpegClocks & m_clocks;
--- a/src/osgPlugins/ffmpeg/FFmpegParameters.cpp
+++ b/src/osgPlugins/ffmpeg/FFmpegParameters.cpp
@@ -19,7 +19,7 @@ extern "C"
#include <libavutil/pixdesc.h>
}
-inline PixelFormat osg_av_get_pix_fmt(const char *name) { return av_get_pix_fmt(name); }
+inline AVPixelFormat osg_av_get_pix_fmt(const char *name) { return av_get_pix_fmt(name); }
namespace osgFFmpeg {
--- a/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp 2016-02-18 21:25:39.627923629 +0000
+++ b/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp 2016-02-18 21:26:17.071140100 +0000
@@ -227,8 +227,7 @@
if (avcodec_open2(m_context, p_codec, NULL) < 0)
throw std::runtime_error("avcodec_open() failed");
- m_context->get_buffer = avcodec_default_get_buffer;
- m_context->release_buffer = avcodec_default_release_buffer;
+ m_context->get_buffer2 = avcodec_default_get_buffer2;
}