Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-2-2
Commits
b98b0210
Commit
b98b0210
authored
Oct 20, 2013
by
Rafaël Carré
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
libvpx decoder
parent
804dfa33
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
255 additions
and
0 deletions
+255
-0
NEWS
NEWS
+1
-0
configure.ac
configure.ac
+19
-0
modules/MODULES_LIST
modules/MODULES_LIST
+1
-0
modules/codec/Makefile.am
modules/codec/Makefile.am
+8
-0
modules/codec/vpx.c
modules/codec/vpx.c
+225
-0
po/POTFILES.in
po/POTFILES.in
+1
-0
No files found.
NEWS
View file @
b98b0210
...
...
@@ -7,6 +7,7 @@ Access:
Decoders:
* Partial support for Voxware MetaSound
* libvpx decoder for VP8 and VP9
Encoder:
* Support for MPEG-2 encoding using x262
...
...
configure.ac
View file @
b98b0210
...
...
@@ -2496,6 +2496,25 @@ if test "${enable_faad}" != "no"; then
fi
fi
dnl
dnl libvpx decoder plugin
dnl
AC_ARG_ENABLE(vpx,
AS_HELP_STRING([--enable-vpx],[libvpx VP8/VP9 decoder (default auto)]))
AS_IF([test "${enable_vpx}" != "no"],[
PKG_CHECK_MODULES([VPX], [vpx] , [
VLC_ADD_PLUGIN([vpx])
VLC_ADD_CPPFLAGS([vpx], [${VPX_CFLAGS}])
VLC_ADD_LIBS([vpx], [${VPX_LIBS}])
AC_CHECK_LIB([vpx],[vpx_codec_vp9_dx], [
VLC_ADD_CPPFLAGS([vpx], [-DENABLE_VP9_DECODER])
], [], [${VPX_LIBS}])
], [
AS_IF([test "${enable_vpx}" = "yes"],[
AC_MSG_ERROR([libvpx was not found])
])])
])
dnl
dnl twolame encoder plugin
dnl
...
...
modules/MODULES_LIST
View file @
b98b0210
...
...
@@ -382,6 +382,7 @@ $Id$
* vout_ios2: iOS video provider using OpenGL ES 2
* vout_macosx: Mac OS X OpenGL provider
* vout_sdl: video output module using the SDL library
* vpx: WebM decoder (VP8/VP9)
* vsxu: audio visualization using Vovoid VSXu
* wall: image wall filter
* wav: Wav demuxer
...
...
modules/codec/Makefile.am
View file @
b98b0210
...
...
@@ -398,6 +398,14 @@ libshine_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(codecdir)'
EXTRA_LTLIBRARIES
+=
libshine_plugin.la
codec_LTLIBRARIES
+=
$(LTLIBshine)
libvpx_plugin_la_SOURCES
=
codec/vpx.c
libvpx_plugin_la_CPPFLAGS
=
$(AM_CPPFLAGS)
libvpx_plugin_la_CFLAGS
=
$(AM_CFLAGS)
$(VPX_CFLAGS)
$(CPPFLAGS_vpx)
libvpx_plugin_la_LDFLAGS
=
$(AM_LDFLAGS)
-rpath
'
$(codecdir)
'
libvpx_plugin_la_LIBADD
=
$(VPX_LIBS)
EXTRA_LTLIBRARIES
+=
libvpx_plugin.la
codec_LTLIBRARIES
+=
$(LTLIBvpx)
libtwolame_plugin_la_SOURCES
=
codec/twolame.c
libtwolame_plugin_la_CPPFLAGS
=
$(AM_CPPFLAGS)
-DLIBTWOLAME_STATIC
libtwolame_plugin_la_CFLAGS
=
$(AM_CFLAGS)
$(TWOLAME_CFLAGS)
...
...
modules/codec/vpx.c
0 → 100644
View file @
b98b0210
/*****************************************************************************
* vpx.c: libvpx decoder (VP8/VP9) module
*****************************************************************************
* Copyright (C) 2013 Rafaël Carré
*
* Authors: Rafaël Carré <funman@videolanorg>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <vlc_common.h>
#include <vlc_plugin.h>
#include <vlc_codec.h>
#include <vpx/vpx_decoder.h>
#include <vpx/vp8dx.h>
/****************************************************************************
* Local prototypes
****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
/*****************************************************************************
* Module descriptor
*****************************************************************************/
vlc_module_begin
()
set_shortname
(
"vpx"
)
set_description
(
N_
(
"WebM video decoder"
))
set_capability
(
"decoder"
,
80
)
set_callbacks
(
Open
,
Close
)
set_category
(
CAT_INPUT
)
set_subcategory
(
SUBCAT_INPUT_VCODEC
)
vlc_module_end
()
/*****************************************************************************
* decoder_sys_t: libvpx decoder descriptor
*****************************************************************************/
struct
decoder_sys_t
{
struct
vpx_codec_ctx
ctx
;
};
/****************************************************************************
* Decode: the whole thing
****************************************************************************/
static
picture_t
*
Decode
(
decoder_t
*
dec
,
block_t
**
pp_block
)
{
struct
vpx_codec_ctx
*
ctx
=
&
dec
->
p_sys
->
ctx
;
block_t
*
block
=
*
pp_block
;
if
(
!
block
)
return
NULL
;
if
(
block
->
i_flags
&
(
BLOCK_FLAG_DISCONTINUITY
|
BLOCK_FLAG_CORRUPTED
))
return
NULL
;
/* Associate packet PTS with decoded frame */
mtime_t
*
pkt_pts
=
malloc
(
sizeof
(
*
pkt_pts
));
if
(
!
pkt_pts
)
{
block_Release
(
block
);
*
pp_block
=
NULL
;
return
NULL
;
}
*
pkt_pts
=
block
->
i_pts
;
vpx_codec_err_t
err
;
err
=
vpx_codec_decode
(
ctx
,
block
->
p_buffer
,
block
->
i_buffer
,
pkt_pts
,
0
);
block_Release
(
block
);
*
pp_block
=
NULL
;
if
(
err
!=
VPX_CODEC_OK
)
{
free
(
pkt_pts
);
const
char
*
error
=
vpx_codec_error
(
ctx
);
const
char
*
detail
=
vpx_codec_error_detail
(
ctx
);
if
(
!
detail
)
detail
=
"no specific information"
;
msg_Err
(
dec
,
"Failed to decode frame: %s (%s)"
,
error
,
detail
);
return
NULL
;
}
const
void
*
iter
=
NULL
;
struct
vpx_image
*
img
=
vpx_codec_get_frame
(
ctx
,
&
iter
);
if
(
!
img
)
return
NULL
;
/* fetches back the PTS */
pkt_pts
=
img
->
user_priv
;
mtime_t
pts
=
*
pkt_pts
;
free
(
pkt_pts
);
if
(
img
->
fmt
!=
VPX_IMG_FMT_I420
)
{
msg_Err
(
dec
,
"Unsupported output colorspace %d"
,
img
->
fmt
);
return
NULL
;
}
video_format_t
*
v
=
&
dec
->
fmt_out
.
video
;
if
(
img
->
d_w
!=
v
->
i_visible_width
||
img
->
d_h
!=
v
->
i_visible_height
)
{
v
->
i_visible_width
=
img
->
d_w
;
v
->
i_visible_height
=
img
->
d_h
;
}
picture_t
*
pic
=
decoder_NewPicture
(
dec
);
if
(
!
pic
)
return
NULL
;
for
(
int
plane
=
0
;
plane
<
pic
->
i_planes
;
plane
++
)
{
uint8_t
*
src
=
img
->
planes
[
plane
];
uint8_t
*
dst
=
pic
->
p
[
plane
].
p_pixels
;
int
src_stride
=
img
->
stride
[
plane
];
int
dst_stride
=
pic
->
p
[
plane
].
i_pitch
;
int
size
=
__MIN
(
src_stride
,
dst_stride
);
for
(
int
line
=
0
;
line
<
pic
->
p
[
plane
].
i_visible_lines
;
line
++
)
{
memcpy
(
dst
,
src
,
size
);
src
+=
src_stride
;
dst
+=
dst_stride
;
}
}
pic
->
b_progressive
=
true
;
/* codec does not support interlacing */
pic
->
date
=
pts
;
return
pic
;
}
/*****************************************************************************
* Open: probe the decoder
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
{
decoder_t
*
dec
=
(
decoder_t
*
)
p_this
;
const
struct
vpx_codec_iface
*
iface
;
int
vp_version
;
switch
(
dec
->
fmt_in
.
i_codec
)
{
case
VLC_CODEC_VP8
:
iface
=
&
vpx_codec_vp8_dx_algo
;
vp_version
=
8
;
break
;
#ifdef ENABLE_VP9_DECODER
case
VLC_CODEC_VP9
:
iface
=
&
vpx_codec_vp9_dx_algo
;
vp_version
=
9
;
break
;
#endif
default:
return
VLC_EGENERIC
;
}
decoder_sys_t
*
sys
=
malloc
(
sizeof
(
*
sys
));
if
(
!
sys
)
return
VLC_ENOMEM
;
dec
->
p_sys
=
sys
;
struct
vpx_codec_dec_cfg
deccfg
=
{
.
threads
=
__MIN
(
vlc_GetCPUCount
(),
16
)
};
msg_Dbg
(
p_this
,
"VP%d: using libvpx version %s (build options %s)"
,
vp_version
,
vpx_codec_version_str
(),
vpx_codec_build_config
());
if
(
vpx_codec_dec_init
(
&
sys
->
ctx
,
iface
,
&
deccfg
,
0
)
!=
VPX_CODEC_OK
)
{
const
char
*
error
=
vpx_codec_error
(
&
sys
->
ctx
);
msg_Err
(
p_this
,
"Failed to initialize decoder: %s
\n
"
,
error
);
free
(
sys
);
return
VLC_EGENERIC
;;
}
dec
->
pf_decode_video
=
Decode
;
dec
->
fmt_out
.
i_cat
=
VIDEO_ES
;
dec
->
fmt_out
.
video
.
i_width
=
dec
->
fmt_in
.
video
.
i_width
;
dec
->
fmt_out
.
video
.
i_height
=
dec
->
fmt_in
.
video
.
i_height
;
dec
->
fmt_out
.
i_codec
=
VLC_CODEC_I420
;
dec
->
b_need_packetized
=
true
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
* Close: decoder destruction
*****************************************************************************/
static
void
Close
(
vlc_object_t
*
p_this
)
{
decoder_t
*
dec
=
(
decoder_t
*
)
p_this
;
decoder_sys_t
*
sys
=
dec
->
p_sys
;
/* Free our PTS */
const
void
*
iter
=
NULL
;
for
(;;)
{
struct
vpx_image
*
img
=
vpx_codec_get_frame
(
&
sys
->
ctx
,
&
iter
);
if
(
!
img
)
break
;
free
(
img
->
user_priv
);
}
vpx_codec_destroy
(
&
sys
->
ctx
);
free
(
sys
);
}
po/POTFILES.in
View file @
b98b0210
...
...
@@ -404,6 +404,7 @@ modules/codec/theora.c
modules/codec/twolame.c
modules/codec/uleaddvaudio.c
modules/codec/vorbis.c
modules/codec/vpx.c
modules/codec/wmafixed/wma.c
modules/codec/x264.c
modules/codec/x265.c
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment