diff options
author | Edward Hervey <edward.hervey@collabora.co.uk> | 2011-12-30 11:41:17 +0100 |
---|---|---|
committer | Edward Hervey <edward.hervey@collabora.co.uk> | 2011-12-30 11:41:17 +0100 |
commit | f70a623418a52eada0278002f8d266d49957b3d5 (patch) | |
tree | fc54fd9fab400e886b11a9a2b313478b66dd7969 /ext/xvid/gstxvidenc.c | |
parent | d5aaefa59f9ef4153644a2aa254c39a3a9d108e3 (diff) | |
parent | d465188879cd4dd0735e3fbcaeb83d98f217ed88 (diff) | |
download | gstreamer-plugins-bad-f70a623418a52eada0278002f8d266d49957b3d5.tar.gz |
Merge remote-tracking branch 'origin/master' into 0.11-premerge
Conflicts:
docs/libs/Makefile.am
ext/kate/gstkatetiger.c
ext/opus/gstopusdec.c
ext/xvid/gstxvidenc.c
gst-libs/gst/basecamerabinsrc/Makefile.am
gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.c
gst-libs/gst/basecamerabinsrc/gstbasecamerasrc.h
gst-libs/gst/video/gstbasevideocodec.c
gst-libs/gst/video/gstbasevideocodec.h
gst-libs/gst/video/gstbasevideodecoder.c
gst-libs/gst/video/gstbasevideoencoder.c
gst/asfmux/gstasfmux.c
gst/audiovisualizers/gstwavescope.c
gst/camerabin2/gstcamerabin2.c
gst/debugutils/gstcompare.c
gst/frei0r/gstfrei0rmixer.c
gst/mpegpsmux/mpegpsmux.c
gst/mpegtsmux/mpegtsmux.c
gst/mxf/mxfmux.c
gst/videomeasure/gstvideomeasure_ssim.c
gst/videoparsers/gsth264parse.c
gst/videoparsers/gstmpeg4videoparse.c
Diffstat (limited to 'ext/xvid/gstxvidenc.c')
-rw-r--r-- | ext/xvid/gstxvidenc.c | 192 |
1 files changed, 188 insertions, 4 deletions
diff --git a/ext/xvid/gstxvidenc.c b/ext/xvid/gstxvidenc.c index dc60d0d8c..57e9a3317 100644 --- a/ext/xvid/gstxvidenc.c +++ b/ext/xvid/gstxvidenc.c @@ -51,14 +51,37 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-xvid, " + GST_STATIC_CAPS ("video/mpeg, " + "mpegversion = (int) 4, " + "systemstream = (boolean) FALSE, " + "width = (int) [ 0, MAX ], " + "height = (int) [ 0, MAX ], " + "framerate = (fraction) [ 0/1, MAX ], " + "profile = (string) simple, " + "level = (string) { 0, 1, 2, 3, 4a, 5, 6 };" + "video/mpeg, " + "mpegversion = (int) 4, " + "systemstream = (boolean) FALSE, " + "width = (int) [ 0, MAX ], " + "height = (int) [ 0, MAX ], " + "framerate = (fraction) [ 0/1, MAX ], " + "profile = (string) advanced-real-time-simple, " + "level = (string) { 1, 2, 3, 4 };" + "video/mpeg, " + "mpegversion = (int) 4, " + "systemstream = (boolean) FALSE, " "width = (int) [ 0, MAX ], " - "height = (int) [ 0, MAX ], " "framerate = (fraction) [ 0/1, MAX ]; " + "height = (int) [ 0, MAX ], " + "framerate = (fraction) [ 0/1, MAX ], " + "profile = (string) advanced-simple, " + "level = (string) { 0, 1, 2, 3, 4 };" "video/mpeg, " "mpegversion = (int) 4, " "systemstream = (boolean) FALSE, " + "width = (int) [ 0, MAX ], " "height = (int) [ 0, MAX ]; " + "video/x-xvid, " "width = (int) [ 0, MAX ], " - "height = (int) [ 0, MAX ], " "framerate = (fraction) [ 0/1, MAX ]") + "height = (int) [ 0, MAX ], " "framerate = (fraction) [ 0/1, MAX ];") ); @@ -106,6 +129,9 @@ gst_xvidenc_profile_get_type (void) {XVID_PROFILE_S_L1, "S_L1", "Simple profile, L1"}, {XVID_PROFILE_S_L2, "S_L2", "Simple profile, L2"}, {XVID_PROFILE_S_L3, "S_L3", "Simple profile, L3"}, + {XVID_PROFILE_S_L4a, "S_L4a", "Simple profile, L4a"}, + {XVID_PROFILE_S_L5, "S_L5", "Simple profile, L5"}, + {XVID_PROFILE_S_L6, "S_L6", "Simple profile, L6"}, {XVID_PROFILE_ARTS_L1, "ARTS_L1", "Advanced real-time simple profile, L1"}, {XVID_PROFILE_ARTS_L2, "ARTS_L2", @@ -578,11 +604,97 @@ gst_xvidenc_setup (GstXvidEnc * xvidenc) xvid_enc_create_t xenc; xvid_enc_plugin_t xplugin[2]; gint ret; + GstCaps *allowed_caps; + gint profile = -1; + + /* Negotiate profile/level with downstream */ + allowed_caps = gst_pad_get_allowed_caps (xvidenc->srcpad); + if (allowed_caps && !gst_caps_is_empty (allowed_caps)) { + const gchar *profile_str, *level_str; + + allowed_caps = gst_caps_make_writable (allowed_caps); + gst_caps_truncate (allowed_caps); + + profile_str = + gst_structure_get_string (gst_caps_get_structure (allowed_caps, 0), + "profile"); + level_str = + gst_structure_get_string (gst_caps_get_structure (allowed_caps, 0), + "level"); + if (profile_str) { + if (g_str_equal (profile_str, "simple")) { + if (!level_str) { + profile = XVID_PROFILE_S_L0; + } else if (g_str_equal (level_str, "0")) { + profile = XVID_PROFILE_S_L0; + } else if (g_str_equal (level_str, "1")) { + profile = XVID_PROFILE_S_L1; + } else if (g_str_equal (level_str, "2")) { + profile = XVID_PROFILE_S_L2; + } else if (g_str_equal (level_str, "3")) { + profile = XVID_PROFILE_S_L3; + } else if (g_str_equal (level_str, "4a")) { + profile = XVID_PROFILE_S_L4a; + } else if (g_str_equal (level_str, "5")) { + profile = XVID_PROFILE_S_L5; + } else if (g_str_equal (level_str, "6")) { + profile = XVID_PROFILE_S_L6; + } else { + GST_ERROR_OBJECT (xvidenc, + "Invalid profile/level combination (%s %s)", profile_str, + level_str); + } + } else if (g_str_equal (profile_str, "advanced-real-time-simple")) { + if (!level_str) { + profile = XVID_PROFILE_ARTS_L1; + } else if (g_str_equal (level_str, "1")) { + profile = XVID_PROFILE_ARTS_L1; + } else if (g_str_equal (level_str, "2")) { + profile = XVID_PROFILE_ARTS_L2; + } else if (g_str_equal (level_str, "3")) { + profile = XVID_PROFILE_ARTS_L3; + } else if (g_str_equal (level_str, "4")) { + profile = XVID_PROFILE_ARTS_L4; + } else { + GST_ERROR_OBJECT (xvidenc, + "Invalid profile/level combination (%s %s)", profile_str, + level_str); + } + } else if (g_str_equal (profile_str, "advanced-simple")) { + if (!level_str) { + profile = XVID_PROFILE_AS_L0; + } else if (g_str_equal (level_str, "0")) { + profile = XVID_PROFILE_AS_L0; + } else if (g_str_equal (level_str, "1")) { + profile = XVID_PROFILE_AS_L1; + } else if (g_str_equal (level_str, "2")) { + profile = XVID_PROFILE_AS_L2; + } else if (g_str_equal (level_str, "3")) { + profile = XVID_PROFILE_AS_L3; + } else if (g_str_equal (level_str, "4")) { + profile = XVID_PROFILE_AS_L4; + } else { + GST_ERROR_OBJECT (xvidenc, + "Invalid profile/level combination (%s %s)", profile_str, + level_str); + } + } else { + GST_ERROR_OBJECT (xvidenc, "Invalid profile (%s)", profile_str); + } + } + } + if (allowed_caps) + gst_caps_unref (allowed_caps); + + if (profile != -1) { + xvidenc->profile = profile; + g_object_notify (G_OBJECT (xvidenc), "profile"); + } /* see xvid.h for the meaning of all this. */ gst_xvid_init_struct (xenc); - xenc.profile = xvidenc->profile; + xenc.profile = xvidenc->used_profile = xvidenc->profile; xenc.width = xvidenc->width; xenc.height = xvidenc->height; xenc.max_bframes = xvidenc->max_bframes; @@ -783,6 +895,78 @@ gst_xvidenc_setcaps (GstPad * pad, GstCaps * vscaps) /* just to be sure */ gst_pad_fixate_caps (xvidenc->srcpad, new_caps); + if (xvidenc->used_profile != 0) { + switch (xvidenc->used_profile) { + case XVID_PROFILE_S_L0: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, "simple", + "level", G_TYPE_STRING, "0", NULL); + break; + case XVID_PROFILE_S_L1: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, "simple", + "level", G_TYPE_STRING, "1", NULL); + break; + case XVID_PROFILE_S_L2: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, "simple", + "level", G_TYPE_STRING, "2", NULL); + break; + case XVID_PROFILE_S_L3: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, "simple", + "level", G_TYPE_STRING, "3", NULL); + break; + case XVID_PROFILE_S_L4a: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, "simple", + "level", G_TYPE_STRING, "4a", NULL); + break; + case XVID_PROFILE_S_L5: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, "simple", + "level", G_TYPE_STRING, "5", NULL); + break; + case XVID_PROFILE_S_L6: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, "simple", + "level", G_TYPE_STRING, "6", NULL); + break; + case XVID_PROFILE_ARTS_L1: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, + "advanced-real-time-simple", "level", G_TYPE_STRING, "1", NULL); + break; + case XVID_PROFILE_ARTS_L2: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, + "advanced-real-time-simple", "level", G_TYPE_STRING, "2", NULL); + break; + case XVID_PROFILE_ARTS_L3: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, + "advanced-real-time-simple", "level", G_TYPE_STRING, "3", NULL); + break; + case XVID_PROFILE_ARTS_L4: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, + "advanced-real-time-simple", "level", G_TYPE_STRING, "4", NULL); + break; + case XVID_PROFILE_AS_L0: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, + "advanced-simple", "level", G_TYPE_STRING, "0", NULL); + break; + case XVID_PROFILE_AS_L1: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, + "advanced-simple", "level", G_TYPE_STRING, "1", NULL); + break; + case XVID_PROFILE_AS_L2: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, + "advanced-simple", "level", G_TYPE_STRING, "2", NULL); + break; + case XVID_PROFILE_AS_L3: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, + "advanced-simple", "level", G_TYPE_STRING, "3", NULL); + break; + case XVID_PROFILE_AS_L4: + gst_caps_set_simple (new_caps, "profile", G_TYPE_STRING, + "advanced-simple", "level", G_TYPE_STRING, "4", NULL); + break; + default: + g_assert_not_reached (); + break; + } + } + /* src pad should accept anyway */ ret = gst_pad_set_caps (xvidenc->srcpad, new_caps); gst_caps_unref (new_caps); |