Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
gst-libav
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
60
Issues
60
List
Boards
Labels
Service Desk
Milestones
Merge Requests
11
Merge Requests
11
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
GStreamer
gst-libav
Commits
5153d56e
Commit
5153d56e
authored
Dec 22, 2003
by
David Schleef
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Merge CAPS branch
Original commit message from CVS: Merge CAPS branch
parent
4ee3b353
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
681 additions
and
997 deletions
+681
-997
ext/ffmpeg/gstffmpegcodecmap.c
ext/ffmpeg/gstffmpegcodecmap.c
+466
-627
ext/ffmpeg/gstffmpegcodecmap.h
ext/ffmpeg/gstffmpegcodecmap.h
+2
-2
ext/ffmpeg/gstffmpegcolorspace.c
ext/ffmpeg/gstffmpegcolorspace.c
+156
-288
ext/ffmpeg/gstffmpegdec.c
ext/ffmpeg/gstffmpegdec.c
+4
-8
ext/ffmpeg/gstffmpegdemux.c
ext/ffmpeg/gstffmpegdemux.c
+16
-18
ext/ffmpeg/gstffmpegenc.c
ext/ffmpeg/gstffmpegenc.c
+25
-37
ext/ffmpeg/gstffmpegmux.c
ext/ffmpeg/gstffmpegmux.c
+12
-17
No files found.
ext/ffmpeg/gstffmpegcodecmap.c
View file @
5153d56e
This diff is collapsed.
Click to expand it.
ext/ffmpeg/gstffmpegcodecmap.h
View file @
5153d56e
...
...
@@ -49,7 +49,7 @@ gst_ffmpeg_codectype_to_caps (enum CodecType codec_type,
*/
enum
CodecID
gst_ffmpeg_caps_to_codecid
(
GstCaps
*
caps
,
gst_ffmpeg_caps_to_codecid
(
const
GstCaps
*
caps
,
AVCodecContext
*
context
);
/* caps_to_codectype () transforms a GstCaps that belongs to
...
...
@@ -58,7 +58,7 @@ gst_ffmpeg_caps_to_codecid (GstCaps *caps,
void
gst_ffmpeg_caps_to_codectype
(
enum
CodecType
type
,
GstCaps
*
caps
,
const
GstCaps
*
caps
,
AVCodecContext
*
context
);
/* _formatid_to_caps () is meant for muxers/demuxers, it
...
...
ext/ffmpeg/gstffmpegcolorspace.c
View file @
5153d56e
...
...
@@ -32,35 +32,38 @@
#include "gstffmpegcodecmap.h"
#define GST_TYPE_FFMPEGCSP \
GST_DEBUG_CATEGORY_STATIC
(
debug_ffmpeg_csp
);
#define GST_CAT_DEFAULT debug_ffmpeg_csp
#define GST_TYPE_FFMPEG_CSP \
(gst_ffmpegcsp_get_type())
#define GST_FFMPEGCSP(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FFMPEGCSP,GstFFMpegCsp))
#define GST_FFMPEGCSP_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FFMPEGCSP,GstFFMpegCsp))
#define GST_IS_FFMPEGCSP(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FFMPEGCSP))
#define GST_IS_FFMPEGCSP_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FFMPEGCSP))
#define GST_FFMPEG
_
CSP(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FFMPEG
_
CSP,GstFFMpegCsp))
#define GST_FFMPEG
_
CSP_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FFMPEG
_
CSP,GstFFMpegCsp))
#define GST_IS_FFMPEG
_
CSP(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FFMPEG
_
CSP))
#define GST_IS_FFMPEG
_
CSP_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FFMPEG
_
CSP))
typedef
struct
_GstFFMpegCsp
GstFFMpegCsp
;
typedef
struct
_GstFFMpegCspClass
GstFFMpegCspClass
;
struct
_GstFFMpegCsp
{
GstElement
element
;
GstPad
*
sinkpad
,
*
srcpad
;
GstElement
element
;
gint
width
,
height
;
gfloat
fps
;
enum
PixelFormat
from_pixfmt
,
to_pixfmt
;
AVFrame
*
from_frame
,
*
to_frame
;
GstCaps
*
sinkcaps
;
GstPad
*
sinkpad
;
GstPad
*
srcpad
;
gboolean
need_caps_nego
;
GstBufferPool
*
pool
;
gint
width
;
gint
height
;
gdouble
fps
;
enum
PixelFormat
from_pixfmt
;
enum
PixelFormat
to_pixfmt
;
AVFrame
*
from_frame
;
AVFrame
*
to_frame
;
};
struct
_GstFFMpegCspClass
{
...
...
@@ -88,176 +91,92 @@ enum {
static
GType
gst_ffmpegcsp_get_type
(
void
);
static
void
gst_ffmpegcsp_base_init
(
GstFFMpegCspClass
*
klass
);
static
void
gst_ffmpegcsp_class_init
(
GstFFMpegCspClass
*
klass
);
static
void
gst_ffmpegcsp_init
(
GstFFMpegCsp
*
space
);
static
void
gst_ffmpegcsp_set_property
(
GObject
*
object
,
guint
prop_id
,
const
GValue
*
value
,
GParamSpec
*
pspec
);
static
void
gst_ffmpegcsp_get_property
(
GObject
*
object
,
guint
prop_id
,
GValue
*
value
,
GParamSpec
*
pspec
);
static
void
gst_ffmpegcsp_base_init
(
gpointer
g_class
);
static
void
gst_ffmpegcsp_class_init
(
gpointer
g_class
,
gpointer
class_data
);
static
void
gst_ffmpegcsp_init
(
GTypeInstance
*
instance
,
gpointer
g_class
);
static
GstPadLinkReturn
gst_ffmpegcsp_
sinkconnect
(
GstPad
*
pad
,
GstCaps
*
caps
);
gst_ffmpegcsp_
connect
(
GstPad
*
pad
,
const
GstCaps
*
caps
);
static
GstPadLinkReturn
gst_ffmpegcsp_srcconnect
(
GstPad
*
pad
,
GstCaps
*
caps
);
static
GstPadLinkReturn
gst_ffmpegcsp_srcconnect_func
(
GstPad
*
pad
,
GstCaps
*
caps
,
gboolean
newcaps
);
gst_ffmpegcsp_try_connect
(
GstPad
*
pad
,
AVCodecContext
*
ctx
,
double
fps
);
static
void
gst_ffmpegcsp_chain
(
GstPad
*
pad
,
GstData
*
data
);
static
void
gst_ffmpegcsp_chain
(
GstPad
*
pad
,
GstData
*
data
);
static
GstElementStateReturn
gst_ffmpegcsp_change_state
(
GstElement
*
element
);
gst_ffmpegcsp_change_state
(
GstElement
*
element
);
static
GstPadTemplate
*
srctempl
,
*
sinktempl
;
static
GstElementClass
*
parent_class
=
NULL
;
/*static guint gst_ffmpegcsp_signals[LAST_SIGNAL] = { 0 }; */
static
GstBufferPool
*
ffmpegcsp_get_bufferpool
(
GstPad
*
pad
)
{
GstFFMpegCsp
*
space
;
space
=
GST_FFMPEGCSP
(
gst_pad_get_parent
(
pad
));
if
(
space
->
from_pixfmt
==
space
->
to_pixfmt
&&
space
->
from_pixfmt
!=
PIX_FMT_NB
)
{
return
gst_pad_get_bufferpool
(
space
->
srcpad
);
}
return
NULL
;
}
static
GstCaps
*
gst_ffmpegcsp_getcaps
(
GstPad
*
pad
,
GstCaps
*
caps
)
{
GstFFMpegCsp
*
space
;
GstCaps
*
result
;
GstCaps
*
peercaps
;
GstCaps
*
ourcaps
;
space
=
GST_FFMPEGCSP
(
gst_pad_get_parent
(
pad
));
/* we can do everything our peer can... */
peercaps
=
gst_caps_copy
(
gst_pad_get_allowed_caps
(
space
->
srcpad
));
/* and our own template of course */
ourcaps
=
gst_caps_copy
(
gst_pad_get_pad_template_caps
(
pad
));
/* merge them together, we prefer the peercaps first */
result
=
gst_caps_prepend
(
ourcaps
,
peercaps
);
return
result
;
}
/* does caps nego on a pad */
static
GstPadLinkReturn
gst_ffmpegcsp_srcconnect_func
(
GstPad
*
pad
,
GstCaps
*
caps
,
gboolean
newcaps
)
gst_ffmpegcsp_try_connect
(
GstPad
*
pad
,
AVCodecContext
*
ctx
,
double
fps
)
{
AVCodecContext
*
ctx
;
gint
i
,
ret
;
GstFFMpegCsp
*
space
;
GstCaps
*
peercaps
;
GstCaps
*
ourcaps
;
space
=
GST_FFMPEGCSP
(
gst_pad_get_parent
(
pad
));
/* we cannot operate if we didn't get src caps */
if
(
!
(
ourcaps
=
space
->
sinkcaps
))
{
if
(
newcaps
)
{
gst_pad_recalc_allowed_caps
(
space
->
sinkpad
);
}
gboolean
try_all
=
(
ctx
->
pix_fmt
!=
PIX_FMT_NB
);
GstCaps
*
caps
;
space
=
GST_FFMPEG_CSP
(
gst_pad_get_parent
(
pad
));
return
GST_PAD_LINK_DELAYED
;
}
/* loop over all possibilities and select the first one we can convert and
* is accepted by the peer */
caps
=
gst_ffmpeg_codectype_to_caps
(
CODEC_TYPE_VIDEO
,
ctx
);
for
(
i
=
0
;
i
<
gst_caps_get_size
(
caps
);
i
++
)
{
GstStructure
*
structure
=
gst_caps_get_structure
(
caps
,
i
);
GstCaps
*
setcaps
;
if
(
fps
>
0
)
gst_structure_set
(
structure
,
"framerate"
,
G_TYPE_DOUBLE
,
fps
,
NULL
);
setcaps
=
gst_caps_new_full
(
gst_structure_copy
(
structure
),
NULL
);
ret
=
gst_pad_try_set_caps
(
pad
,
setcaps
);
gst_caps_free
(
setcaps
);
if
(
ret
>=
0
)
{
if
(
ctx
->
pix_fmt
==
PIX_FMT_NB
)
gst_ffmpeg_caps_to_codectype
(
CODEC_TYPE_VIDEO
,
caps
,
ctx
);
gst_caps_free
(
caps
);
/* first see if we can do the format natively by filtering the peer caps
* with our incomming caps */
if
((
peercaps
=
gst_caps_intersect
(
caps
,
ourcaps
))
!=
NULL
)
{
/* see if the peer likes it too, it should as the caps say so.. */
if
(
gst_pad_try_set_caps
(
space
->
srcpad
,
peercaps
)
>
0
)
{
space
->
from_pixfmt
=
space
->
to_pixfmt
=
-
1
;
return
GST_PAD_LINK_DONE
;
return
ret
;
}
}
/* then see what the peer has that matches the size */
peercaps
=
gst_caps_intersect
(
caps
,
gst_caps_append
(
GST_CAPS_NEW
(
"ffmpegcsp_filter"
,
"video/x-raw-yuv"
,
"width"
,
GST_PROPS_INT
(
space
->
width
),
"height"
,
GST_PROPS_INT
(
space
->
height
),
"framerate"
,
GST_PROPS_FLOAT
(
space
->
fps
)
),
GST_CAPS_NEW
(
"ffmpegcsp_filter"
,
"video/x-raw-rgb"
,
"width"
,
GST_PROPS_INT
(
space
->
width
),
"height"
,
GST_PROPS_INT
(
space
->
height
),
"framerate"
,
GST_PROPS_FLOAT
(
space
->
fps
)
)));
/* we are looping over the caps, so we have to get rid of the lists */
peercaps
=
gst_caps_normalize
(
peercaps
);
/* loop over all possibilities and select the first one we can convert and
* is accepted by the peer */
ctx
=
avcodec_alloc_context
();
while
(
peercaps
)
{
ctx
->
width
=
space
->
width
;
ctx
->
height
=
space
->
height
;
if
(
try_all
)
{
ctx
->
pix_fmt
=
PIX_FMT_NB
;
gst_ffmpeg_caps_to_codectype
(
CODEC_TYPE_VIDEO
,
peercaps
,
ctx
);
if
(
ctx
->
pix_fmt
!=
PIX_FMT_NB
)
{
GstCaps
*
one
=
gst_caps_copy_1
(
peercaps
);
if
(
gst_pad_try_set_caps
(
space
->
srcpad
,
one
)
>
0
)
{
space
->
to_pixfmt
=
ctx
->
pix_fmt
;
gst_caps_unref
(
one
);
av_free
(
ctx
);
if
(
space
->
from_frame
)
av_free
(
space
->
from_frame
);
if
(
space
->
to_frame
)
av_free
(
space
->
to_frame
);
space
->
from_frame
=
avcodec_alloc_frame
();
space
->
to_frame
=
avcodec_alloc_frame
();
return
GST_PAD_LINK_DONE
;
}
gst_caps_unref
(
one
);
}
peercaps
=
peercaps
->
next
;
return
gst_ffmpegcsp_try_connect
(
pad
,
ctx
,
fps
);
}
else
{
return
GST_PAD_LINK_REFUSED
;
}
av_free
(
ctx
);
/* we disable ourself here */
space
->
from_pixfmt
=
space
->
to_pixfmt
=
PIX_FMT_NB
;
return
GST_PAD_LINK_REFUSED
;
}
static
GstPadLinkReturn
gst_ffmpegcsp_sinkconnect
(
GstPad
*
pad
,
GstCaps
*
caps
)
gst_ffmpegcsp_connect
(
GstPad
*
pad
,
const
GstCaps
*
caps
)
{
AVCodecContext
*
ctx
;
GstFFMpegCsp
*
space
;
GstPad
*
peer
;
space
=
GST_FFMPEGCSP
(
gst_pad_get_parent
(
pad
));
if
(
!
GST_CAPS_IS_FIXED
(
caps
))
{
return
GST_PAD_LINK_DELAYED
;
gdouble
fps
;
enum
PixelFormat
pixfmt
;
GstPad
*
other
;
enum
PixelFormat
*
format
,
*
other_format
;
space
=
GST_FFMPEG_CSP
(
gst_pad_get_parent
(
pad
));
if
(
space
->
sinkpad
==
pad
)
{
other
=
space
->
srcpad
;
format
=
&
space
->
from_pixfmt
;
other_format
=
&
space
->
to_pixfmt
;
}
else
if
(
space
->
srcpad
==
pad
)
{
other
=
space
->
sinkpad
;
format
=
&
space
->
to_pixfmt
;
other_format
=
&
space
->
from_pixfmt
;
}
else
{
g_assert_not_reached
();
return
GST_PAD_LINK_REFUSED
;
}
ctx
=
avcodec_alloc_context
();
ctx
->
width
=
0
;
ctx
->
height
=
0
;
...
...
@@ -265,42 +184,39 @@ gst_ffmpegcsp_sinkconnect (GstPad *pad,
gst_ffmpeg_caps_to_codectype
(
CODEC_TYPE_VIDEO
,
caps
,
ctx
);
if
(
!
ctx
->
width
||
!
ctx
->
height
||
ctx
->
pix_fmt
==
PIX_FMT_NB
)
{
av_free
(
ctx
);
return
GST_PAD_LINK_REFUSED
;
}
gst_caps_get_float
(
caps
,
"framerate"
,
&
space
->
fps
);
if
(
!
gst_structure_get_double
(
gst_caps_get_structure
(
caps
,
0
),
"framerate"
,
&
fps
))
fps
=
0
;
pixfmt
=
ctx
->
pix_fmt
;
if
(
*
other_format
==
PIX_FMT_NB
||
space
->
width
!=
ctx
->
width
||
space
->
height
!=
ctx
->
height
||
space
->
fps
!=
fps
)
{
GST_DEBUG_OBJECT
(
space
,
"Need caps nego on pad %s for size %dx%d"
,
GST_PAD_NAME
(
other
),
ctx
->
width
,
ctx
->
height
);
/* ctx->pix_fmt is set to preferred format */
if
(
gst_ffmpegcsp_try_connect
(
space
->
sinkpad
,
ctx
,
fps
)
<=
0
)
{
av_free
(
ctx
);
return
GST_PAD_LINK_REFUSED
;
}
*
other_format
=
ctx
->
pix_fmt
;
}
space
->
width
=
ctx
->
width
;
space
->
height
=
ctx
->
height
;
space
->
from_pixfmt
=
ctx
->
pix_fmt
;
space
->
fps
=
fps
;
*
format
=
pixfmt
;
av_free
(
ctx
);
GST_INFO
(
"size: %dx%d"
,
space
->
width
,
space
->
height
);
space
->
sinkcaps
=
caps
;
if
((
peer
=
gst_pad_get_peer
(
pad
))
!=
NULL
)
{
GstPadLinkReturn
ret
;
ret
=
gst_ffmpegcsp_srcconnect_func
(
pad
,
gst_pad_get_caps
(
GST_PAD_PEER
(
space
->
srcpad
)),
FALSE
);
if
(
ret
<=
0
)
{
space
->
sinkcaps
=
NULL
;
return
ret
;
}
return
GST_PAD_LINK_DONE
;
}
return
GST_PAD_LINK_OK
;
}
static
GstPadLinkReturn
gst_ffmpegcsp_srcconnect
(
GstPad
*
pad
,
GstCaps
*
caps
)
{
return
gst_ffmpegcsp_srcconnect_func
(
pad
,
caps
,
TRUE
);
}
static
GType
gst_ffmpegcsp_get_type
(
void
)
{
...
...
@@ -309,66 +225,79 @@ gst_ffmpegcsp_get_type (void)
if
(
!
ffmpegcsp_type
)
{
static
const
GTypeInfo
ffmpegcsp_info
=
{
sizeof
(
GstFFMpegCspClass
),
(
GBaseInitFunc
)
gst_ffmpegcsp_base_init
,
gst_ffmpegcsp_base_init
,
NULL
,
(
GClassInitFunc
)
gst_ffmpegcsp_class_init
,
gst_ffmpegcsp_class_init
,
NULL
,
NULL
,
sizeof
(
GstFFMpegCsp
),
0
,
(
GInstanceInitFunc
)
gst_ffmpegcsp_init
,
gst_ffmpegcsp_init
,
};
ffmpegcsp_type
=
g_type_register_static
(
GST_TYPE_ELEMENT
,
"GstFFMpegColorspace"
,
&
ffmpegcsp_info
,
0
);
GST_DEBUG_CATEGORY_INIT
(
debug_ffmpeg_csp
,
"ffcolorspace"
,
0
,
"FFMpeg colorspace converter"
);
}
return
ffmpegcsp_type
;
}
static
void
gst_ffmpegcsp_base_init
(
GstFFMpegCspClass
*
k
lass
)
gst_ffmpegcsp_base_init
(
gpointer
g_c
lass
)
{
GstElementClass
*
element_class
=
GST_ELEMENT_CLASS
(
klass
);
GstCaps
*
caps
,
*
capscopy
;
GstElementClass
*
element_class
=
GST_ELEMENT_CLASS
(
g_class
);
/* template caps */
caps
=
gst_ffmpeg_codectype_to_caps
(
CODEC_TYPE_VIDEO
,
NULL
);
capscopy
=
gst_caps_copy
(
caps
);
/* build templates */
gst_element_class_add_pad_template
(
element_class
,
gst_pad_template_new
(
"src"
,
GST_PAD_SRC
,
GST_PAD_ALWAYS
,
caps
));
gst_element_class_add_pad_template
(
element_class
,
gst_pad_template_new
(
"sink"
,
GST_PAD_SINK
,
GST_PAD_ALWAYS
,
capscopy
));
gst_element_class_add_pad_template
(
element_class
,
srctempl
);
gst_element_class_add_pad_template
(
element_class
,
sinktempl
);
gst_element_class_set_details
(
element_class
,
&
ffmpegcsp_details
);
}
static
void
gst_ffmpegcsp_class_init
(
GstFFMpegCspClass
*
klass
)
gst_ffmpegcsp_class_init
(
gpointer
g_class
,
gpointer
class_data
)
{
GObjectClass
*
gobject_class
;
GstElementClass
*
gstelement_class
;
gobject_class
=
(
GObjectClass
*
)
klass
;
gstelement_class
=
(
GstElementClass
*
)
klass
;
parent_class
=
g_type_class_ref
(
GST_TYPE_ELEMENT
);
GstElementClass
*
gstelement_class
=
GST_ELEMENT_CLASS
(
g_class
);
gobject_class
->
set_property
=
gst_ffmpegcsp_set_property
;
gobject_class
->
get_property
=
gst_ffmpegcsp_get_property
;
parent_class
=
g_type_class_peek_parent
(
g_class
);
gstelement_class
->
change_state
=
gst_ffmpegcsp_change_state
;
}
static
void
gst_ffmpegcsp_init
(
G
stFFMpegCsp
*
space
)
gst_ffmpegcsp_init
(
G
TypeInstance
*
instance
,
gpointer
g_class
)
{
space
->
sinkpad
=
gst_pad_new_from_template
(
sinktempl
,
"sink"
);
gst_pad_set_link_function
(
space
->
sinkpad
,
gst_ffmpegcsp_sinkconnect
);
gst_pad_set_getcaps_function
(
space
->
sinkpad
,
gst_ffmpegcsp_getcaps
);
gst_pad_set_bufferpool_function
(
space
->
sinkpad
,
ffmpegcsp_get_bufferpool
);
GstFFMpegCsp
*
space
=
GST_FFMPEG_CSP
(
instance
);
space
->
sinkpad
=
gst_pad_new_from_template
(
gst_element_class_get_pad_template
(
GST_ELEMENT_GET_CLASS
(
space
),
"sink"
),
"sink"
);
gst_pad_set_link_function
(
space
->
sinkpad
,
gst_ffmpegcsp_connect
);
gst_pad_set_chain_function
(
space
->
sinkpad
,
gst_ffmpegcsp_chain
);
gst_element_add_pad
(
GST_ELEMENT
(
space
),
space
->
sinkpad
);
space
->
srcpad
=
gst_pad_new_from_template
(
srctempl
,
"src"
);
space
->
srcpad
=
gst_pad_new_from_template
(
gst_element_class_get_pad_template
(
GST_ELEMENT_GET_CLASS
(
space
),
"src"
),
"src"
);
gst_element_add_pad
(
GST_ELEMENT
(
space
),
space
->
srcpad
);
gst_pad_set_link_function
(
space
->
srcpad
,
gst_ffmpegcsp_
src
connect
);
gst_pad_set_link_function
(
space
->
srcpad
,
gst_ffmpegcsp_connect
);
space
->
pool
=
NULL
;
space
->
from_pixfmt
=
space
->
to_pixfmt
=
PIX_FMT_NB
;
space
->
from_frame
=
space
->
to_frame
=
NULL
;
}
...
...
@@ -377,18 +306,18 @@ static void
gst_ffmpegcsp_chain
(
GstPad
*
pad
,
GstData
*
data
)
{
GstBuffer
*
inbuf
=
GST_BUFFER
(
data
);
GstFFMpegCsp
*
space
;
GstBuffer
*
inbuf
=
GST_BUFFER
(
data
);
GstBuffer
*
outbuf
=
NULL
;
g_return_if_fail
(
pad
!=
NULL
);
g_return_if_fail
(
GST_IS_PAD
(
pad
));
g_return_if_fail
(
inbuf
!=
NULL
);
space
=
GST_FFMPEGCSP
(
gst_pad_get_parent
(
pad
));
space
=
GST_FFMPEG
_
CSP
(
gst_pad_get_parent
(
pad
));
g_return_if_fail
(
space
!=
NULL
);
g_return_if_fail
(
GST_IS_FFMPEGCSP
(
space
));
g_return_if_fail
(
GST_IS_FFMPEG
_
CSP
(
space
));
if
(
space
->
from_pixfmt
==
PIX_FMT_NB
||
space
->
to_pixfmt
==
PIX_FMT_NB
)
{
...
...
@@ -399,16 +328,11 @@ gst_ffmpegcsp_chain (GstPad *pad,
if
(
space
->
from_pixfmt
==
space
->
to_pixfmt
)
{
outbuf
=
inbuf
;
}
else
{
if
(
space
->
pool
)
{
outbuf
=
gst_buffer_new_from_pool
(
space
->
pool
,
0
,
0
);
}
if
(
!
outbuf
)
{
guint
size
=
avpicture_get_size
(
space
->
to_pixfmt
,
space
->
width
,
space
->
height
);
outbuf
=
gst_buffer_new_and_alloc
(
size
);
}
guint
size
=
avpicture_get_size
(
space
->
to_pixfmt
,
space
->
width
,
space
->
height
);
/* use bufferpools here */
outbuf
=
gst_buffer_new_and_alloc
(
size
);
/* convert */
avpicture_fill
((
AVPicture
*
)
space
->
from_frame
,
GST_BUFFER_DATA
(
inbuf
),
...
...
@@ -419,8 +343,7 @@ gst_ffmpegcsp_chain (GstPad *pad,
(
AVPicture
*
)
space
->
from_frame
,
space
->
from_pixfmt
,
space
->
width
,
space
->
height
);
GST_BUFFER_TIMESTAMP
(
outbuf
)
=
GST_BUFFER_TIMESTAMP
(
inbuf
);
GST_BUFFER_DURATION
(
outbuf
)
=
GST_BUFFER_DURATION
(
inbuf
);
gst_buffer_stamp
(
outbuf
,
inbuf
);
gst_buffer_unref
(
inbuf
);
}
...
...
@@ -433,14 +356,12 @@ gst_ffmpegcsp_change_state (GstElement *element)
{
GstFFMpegCsp
*
space
;
space
=
GST_FFMPEGCSP
(
element
);
space
=
GST_FFMPEG
_
CSP
(
element
);
switch
(
GST_STATE_TRANSITION
(
element
))
{
case
GST_STATE_
PAUSED_TO_PLAYING
:
space
->
pool
=
gst_pad_get_bufferpool
(
space
->
srcpad
)
;
case
GST_STATE_
READY_TO_PAUSED
:
space
->
need_caps_nego
=
TRUE
;
break
;
case
GST_STATE_PLAYING_TO_PAUSED
:
space
->
pool
=
NULL
;
case
GST_STATE_PAUSED_TO_READY
:
if
(
space
->
from_frame
)
av_free
(
space
->
from_frame
);
...
...
@@ -457,62 +378,9 @@ gst_ffmpegcsp_change_state (GstElement *element)
return
GST_STATE_SUCCESS
;
}
static
void
gst_ffmpegcsp_set_property
(
GObject
*
object
,
guint
prop_id
,
const
GValue
*
value
,
GParamSpec
*
pspec
)
{
GstFFMpegCsp
*
space
;
/* it's not null if we got it, but it might not be ours */
g_return_if_fail
(
GST_IS_FFMPEGCSP
(
object
));
space
=
GST_FFMPEGCSP
(
object
);
switch
(
prop_id
)
{
default:
break
;
}
}
static
void
gst_ffmpegcsp_get_property
(
GObject
*
object
,
guint
prop_id
,
GValue
*
value
,
GParamSpec
*
pspec
)
{
GstFFMpegCsp
*
space
;
/* it's not null if we got it, but it might not be ours */
g_return_if_fail
(
GST_IS_FFMPEGCSP
(
object
));
space
=
GST_FFMPEGCSP
(
object
);
switch
(
prop_id
)
{
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID
(
object
,
prop_id
,
pspec
);
break
;
}
}
gboolean
gst_ffmpegcsp_register
(
GstPlugin
*
plugin
)
{
GstCaps
*
caps
;
/* template caps */
caps
=
gst_ffmpeg_codectype_to_caps
(
CODEC_TYPE_VIDEO
,
NULL
);
/* build templates */
srctempl
=
gst_pad_template_new
(
"src"
,
GST_PAD_SRC
,
GST_PAD_ALWAYS
,
caps
,
NULL
);
gst_caps_ref
(
caps
);
/* FIXME: pad_template_new refs the caps, doesn't it? */
sinktempl
=
gst_pad_template_new
(
"sink"
,
GST_PAD_SINK
,
GST_PAD_ALWAYS
,
caps
,
NULL
);
return
gst_element_register
(
plugin
,
"ffcolorspace"
,
GST_RANK_NONE
,
GST_TYPE_FFMPEGCSP
);
GST_RANK_NONE
,
GST_TYPE_FFMPEG
_
CSP
);
}
ext/ffmpeg/gstffmpegdec.c
View file @
5153d56e
...
...
@@ -92,7 +92,7 @@ static void gst_ffmpegdec_init (GstFFMpegDec *ffmpegdec);
static
void
gst_ffmpegdec_dispose
(
GObject
*
object
);
static
GstPadLinkReturn
gst_ffmpegdec_connect
(
GstPad
*
pad
,
GstCaps
*
caps
);
const
GstCaps
*
caps
);
static
void
gst_ffmpegdec_chain
(
GstPad
*
pad
,
GstData
*
data
);
...
...
@@ -141,9 +141,9 @@ gst_ffmpegdec_base_init (GstFFMpegDecClass *klass)
/* pad templates */
sinktempl
=
gst_pad_template_new
(
"sink"
,
GST_PAD_SINK
,
GST_PAD_ALWAYS
,
params
->
sinkcaps
,
NULL
);
GST_PAD_ALWAYS
,
params
->
sinkcaps
);
srctempl
=
gst_pad_template_new
(
"src"
,
GST_PAD_SRC
,
GST_PAD_ALWAYS
,
params
->
srccaps
,
NULL
);
GST_PAD_ALWAYS
,
params
->
srccaps
);
gst_element_class_add_pad_template
(
element_class
,
srctempl
);
gst_element_class_add_pad_template
(
element_class
,
sinktempl
);
...
...
@@ -206,15 +206,11 @@ gst_ffmpegdec_dispose (GObject *object)