resindvd: Plug a video parser in front of decoder

Seems to make playback both better and worse. The parser needs some
fixing, it seems :-/
This commit is contained in:
Jan Schmidt 2012-08-31 14:13:58 -07:00
parent 463ac4c12f
commit 8f719fea02
2 changed files with 46 additions and 9 deletions

View file

@ -337,6 +337,29 @@ _pad_block_destroy_notify (RsnDvdBinPadBlockCtx * ctx)
g_slice_free (RsnDvdBinPadBlockCtx, ctx); g_slice_free (RsnDvdBinPadBlockCtx, ctx);
} }
static gboolean
try_link_pieces (GstElement * e1, const gchar * pad1, GstElement * e2,
const gchar * pad2)
{
GstPad *src = gst_element_get_static_pad (e1, pad1);
GstPad *sink = gst_element_get_static_pad (e2, pad2);
gboolean ret = FALSE;
if (src == NULL || sink == NULL)
goto done;
if (GST_PAD_LINK_FAILED (gst_pad_link (src, sink)))
goto done;
ret = TRUE;
done:
if (src)
gst_object_unref (src);
if (sink)
gst_object_unref (sink);
return ret;
}
static gboolean static gboolean
create_elements (RsnDvdBin * dvdbin) create_elements (RsnDvdBin * dvdbin)
{ {
@ -380,6 +403,10 @@ create_elements (RsnDvdBin * dvdbin)
"max-size-time", (7 * GST_SECOND / 10), "max-size-bytes", 0, "max-size-time", (7 * GST_SECOND / 10), "max-size-bytes", 0,
"max-size-buffers", 0, NULL); "max-size-buffers", 0, NULL);
if (!try_create_piece (dvdbin, DVD_ELEM_VIDPARSE, "mpegvideoparse", 0,
"vidparse", "video parser"))
return FALSE;
/* Decodebin will throw a missing element message to find an MPEG decoder */ /* Decodebin will throw a missing element message to find an MPEG decoder */
if (!try_create_piece (dvdbin, DVD_ELEM_VIDDEC, NULL, RSN_TYPE_VIDEODEC, if (!try_create_piece (dvdbin, DVD_ELEM_VIDDEC, NULL, RSN_TYPE_VIDEODEC,
"viddec", "video decoder")) "viddec", "video decoder"))
@ -390,6 +417,10 @@ create_elements (RsnDvdBin * dvdbin)
"rsnparsetter", "Aspect ratio adjustment")) "rsnparsetter", "Aspect ratio adjustment"))
return FALSE; return FALSE;
if (!try_link_pieces (dvdbin->pieces[DVD_ELEM_VIDPARSE], "src",
dvdbin->pieces[DVD_ELEM_VIDDEC], "sink"))
goto failed_vidparse_connect;
src = gst_element_get_static_pad (dvdbin->pieces[DVD_ELEM_VIDDEC], "src"); src = gst_element_get_static_pad (dvdbin->pieces[DVD_ELEM_VIDDEC], "src");
sink = gst_element_get_static_pad (dvdbin->pieces[DVD_ELEM_PARSET], "sink"); sink = gst_element_get_static_pad (dvdbin->pieces[DVD_ELEM_PARSET], "sink");
if (src == NULL || sink == NULL) if (src == NULL || sink == NULL)
@ -512,6 +543,10 @@ failed_connect:
GST_ELEMENT_ERROR (dvdbin, CORE, FAILED, (NULL), GST_ELEMENT_ERROR (dvdbin, CORE, FAILED, (NULL),
("Could not connect DVD source and demuxer elements")); ("Could not connect DVD source and demuxer elements"));
goto error_out; goto error_out;
failed_vidparse_connect:
GST_ELEMENT_ERROR (dvdbin, CORE, FAILED, (NULL),
("Could not connect DVD video parser and video decoder"));
goto error_out;
failed_viddec_connect: failed_viddec_connect:
GST_ELEMENT_ERROR (dvdbin, CORE, FAILED, (NULL), GST_ELEMENT_ERROR (dvdbin, CORE, FAILED, (NULL),
("Could not connect DVD video decoder and aspect ratio adjuster")); ("Could not connect DVD video decoder and aspect ratio adjuster"));
@ -674,10 +709,10 @@ demux_pad_added (GstElement * element, GstPad * pad, RsnDvdBin * dvdbin)
s = gst_caps_get_structure (caps, 0); s = gst_caps_get_structure (caps, 0);
g_return_if_fail (s != NULL); g_return_if_fail (s != NULL);
if (can_sink_caps (dvdbin->pieces[DVD_ELEM_VIDDEC], caps)) { if (can_sink_caps (dvdbin->pieces[DVD_ELEM_VIDPARSE], caps)) {
GST_LOG_OBJECT (dvdbin, "Found video pad w/ caps %" GST_PTR_FORMAT, caps); GST_LOG_OBJECT (dvdbin, "Found video pad w/ caps %" GST_PTR_FORMAT, caps);
dest_pad = dest_pad =
gst_element_get_static_pad (dvdbin->pieces[DVD_ELEM_VIDDEC], "sink"); gst_element_get_static_pad (dvdbin->pieces[DVD_ELEM_VIDPARSE], "sink");
} else if (g_str_equal (gst_structure_get_name (s), "subpicture/x-dvd")) { } else if (g_str_equal (gst_structure_get_name (s), "subpicture/x-dvd")) {
GST_LOG_OBJECT (dvdbin, "Found subpicture pad w/ caps %" GST_PTR_FORMAT, GST_LOG_OBJECT (dvdbin, "Found subpicture pad w/ caps %" GST_PTR_FORMAT,
caps); caps);

View file

@ -43,13 +43,15 @@ typedef struct _RsnDvdBinClass RsnDvdBinClass;
#define DVD_ELEM_DEMUX 1 #define DVD_ELEM_DEMUX 1
#define DVD_ELEM_MQUEUE 2 #define DVD_ELEM_MQUEUE 2
#define DVD_ELEM_SPUQ 3 #define DVD_ELEM_SPUQ 3
#define DVD_ELEM_VIDDEC 4 #define DVD_ELEM_VIDPARSE 4
#define DVD_ELEM_PARSET 5 #define DVD_ELEM_VIDDEC 5
#define DVD_ELEM_AUDDEC 6 #define DVD_ELEM_PARSET 6
#define DVD_ELEM_VIDQ 7 #define DVD_ELEM_AUDPARSE 7
#define DVD_ELEM_SPU_SELECT 8 #define DVD_ELEM_AUDDEC 8
#define DVD_ELEM_AUD_SELECT 9 #define DVD_ELEM_VIDQ 9
#define DVD_ELEM_LAST 10 #define DVD_ELEM_SPU_SELECT 10
#define DVD_ELEM_AUD_SELECT 11
#define DVD_ELEM_LAST 12
struct _RsnDvdBin struct _RsnDvdBin
{ {