[Bug 766514] New: androidmedia: Reverse Play

GStreamer (GNOME Bugzilla) bugzilla at gnome.org
Mon May 16 13:40:47 UTC 2016


https://bugzilla.gnome.org/show_bug.cgi?id=766514

            Bug ID: 766514
           Summary: androidmedia: Reverse Play
    Classification: Platform
           Product: GStreamer
           Version: 1.8.1
                OS: other
            Status: NEW
          Severity: normal
          Priority: Normal
         Component: don't know
          Assignee: gstreamer-bugs at lists.freedesktop.org
          Reporter: andy.devar at gmail.com
        QA Contact: gstreamer-bugs at lists.freedesktop.org
     GNOME version: ---

Reverse play (negative rates) do not work with androidmedia. 


Application:
https://cgit.freedesktop.org/~slomo/gst-sdk-tutorials/tree/gst-sdk/tutorials/android-tutorial-5

To change to reverse direction, I added the following code:

/* Send seek event to change rate */
static void send_seek_event (CustomData *data) {
  gint64 position;
  GstEvent *seek_event;

  /* Obtain the current position, needed for the seek event */
  if (!gst_element_query_position (data->pipeline, GST_FORMAT_TIME, &position))
{
    GST_DEBUG ("Unable to retrieve current position.\n");
    return;
  }

  /* Get video sink */
  if (data->video_sink == NULL) {
    // If we have not done so, obtain the sink through which we will send the
seek events
    g_object_get (data->pipeline, "video-sink", &data->video_sink, NULL);
  }

  /* Create the seek event */  
  if (data->rate > 0) {
    gst_element_seek(data->video_sink, data->rate, GST_FORMAT_TIME,
GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
        GST_SEEK_TYPE_SET, position, GST_SEEK_TYPE_NONE, 0);
  } else {
    gst_element_seek(data->video_sink, data->rate, GST_FORMAT_TIME,
GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE |
GST_SEEK_FLAG_TRICKMODE_KEY_UNITS | GST_SEEK_FLAG_TRICKMODE_NO_AUDIO,
        GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, position);
  }

  GST_DEBUG ("Current rate: %g\n", data->rate);
}

static void gst_native_change_direction (JNIEnv* env, jobject thiz) {
  CustomData *data = GET_CUSTOM_DATA (env, thiz, custom_data_field_id);
  if (!data) return;

  data->rate *= -1.0;
  send_seek_event (data);
}


As in the original tutorial-5, I use playbin:
data->pipeline = gst_parse_launch("playbin", &error);

Results:

1. With androidmedia:
a) Forward play (rate=1): 
Videos play smoothly (tried up to 1980x800) regardless of GOP size.

b) Reverse play (rate=-1):
A new frame is displayed only every few seconds. Eventually, video stops to
play.
Same behavior regardless of resolution (even with 320x132) and GOP size (tried
dynamic, 5 and 1).
CPU utilisation is no higher than with forward play, so I assume hardware
acceleration is also used with reverse play.

2. Without androidmedia (commented out in plugins.mk):
(just for comparison - meets my expectation)
a) Forward play (rate=1):
1280x532, dynamic GOP size: Smooth
1280x532, GOP size 1: Smooth
640x266, dynamic GOP size: Smooth
640x266, GOP size 1: Smooth

b) Reverse play (rate=-1):
1280x532, dynamic GOP size: Choppy
1280x532, GOP size 1: Choppy
640x266, GOP size 1: Smooth
640x266, dynamic GOP size: Choppy

The video I used can be downloaded here:
http://www.dvdloc8.com/clip.php?movieid=12167&clipid=3

To create other resolutions/GOP sizes, I used FFMPEG.
Example (GOP size 1, resolution 640x266): 
ffmpeg -i "The Simpsons Movie - 1080p Trailer.mp4" -g 1 scale=640:266 "The
Simpsons Movie - 1080p Trailer_GOP0001_640.mp4"

Hardware: Lenovo Tab2 A10/30
Qualcomm APQ8009
Android 5.1.1

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.


More information about the gstreamer-bugs mailing list