[vlc-commits] commit: Add LibVLC API for vmem ( Rémi Denis-Courmont )

git at videolan.org git at videolan.org
Sat Jul 10 17:10:05 CEST 2010


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Jul 10 18:09:05 2010 +0300| [31150350679286f873c94fc670ddbafddaed7163] | committer: Rémi Denis-Courmont 

Add LibVLC API for vmem

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=31150350679286f873c94fc670ddbafddaed7163
---

 include/vlc/libvlc_media_player.h |   47 +++++++++++++++++++++++++++++++++++++
 src/control/media_player.c        |   31 ++++++++++++++++++++++++
 src/libvlc.sym                    |    2 +
 3 files changed, 80 insertions(+), 0 deletions(-)

diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h
index 10dd6d0..33654a9 100644
--- a/include/vlc/libvlc_media_player.h
+++ b/include/vlc/libvlc_media_player.h
@@ -201,6 +201,53 @@ VLC_PUBLIC_API void libvlc_media_player_pause ( libvlc_media_player_t *p_mi );
 VLC_PUBLIC_API void libvlc_media_player_stop ( libvlc_media_player_t *p_mi );
 
 /**
+ * Set callbacks and private data to render decoded video to a custom area
+ * in memory. Use libvlc_video_set_format() to configure the decoded format.
+ *
+ * Whenever a new video frame needs to be decoded, the lock callback is
+ * invoked. Depending on the video chroma, one or three pixel planes of
+ * adequate dimensions must be returned via the second parameter. Those
+ * planes must be aligned on 32-bytes boundaries.
+ *
+ * When the video frame is decoded, the unlock callback is invoked. The
+ * second parameter to the callback corresponds is the return value of the
+ * lock callback. The third parameter conveys the pixel planes for convenience.
+ *
+ * When the video frame needs to be shown, as determined by the media playback
+ * clock, the display callback is invoked. The second parameter also conveys
+ * the return value from the lock callback.
+ *
+ * \param mp the media player
+ * \param lock callback to allocate video memory
+ * \param unlock callback to release video memory
+ * \param opaque private pointer for the three callbacks (as first parameter)
+ * \version LibVLC 1.1.1 or later
+ */
+VLC_PUBLIC_API
+void libvlc_video_set_callbacks( libvlc_media_player_t *mp,
+    void *(*lock) (void *opaque, void **plane),
+    void (*unlock) (void *opaque, void *picture, void *const *plane),
+    void (*display) (void *opaque, void *picture),
+    void *opaque );
+
+/**
+ * Set decoded video chroma and dimensions. This only works in combination with
+ * libvlc_video_set_callbacks().
+ *
+ * \param mp the media player
+ * \param chroma a four-characters string identifying the chroma
+ *               (e.g. "RV32" or "I420")
+ * \param width pixel width
+ * \param height pixel height
+ * \param pitch line pitch (in bytes)
+ * \version LibVLC 1.1.1 or later
+ */
+VLC_PUBLIC_API
+void libvlc_video_set_format( libvlc_media_player_t *mp, const char *chroma,
+                              unsigned width, unsigned height,
+                              unsigned pitch );
+
+/**
  * Set the NSView handler where the media player should render its video output.
  *
  * Use the vout called "macosx".
diff --git a/src/control/media_player.c b/src/control/media_player.c
index e02dba0..cf54fcd 100644
--- a/src/control/media_player.c
+++ b/src/control/media_player.c
@@ -369,6 +369,14 @@ libvlc_media_player_new( libvlc_instance_t *instance )
     /* Video */
     var_Create (mp, "vout", VLC_VAR_STRING|VLC_VAR_DOINHERIT);
     var_Create (mp, "window", VLC_VAR_STRING);
+    var_Create (mp, "vmem-lock", VLC_VAR_ADDRESS);
+    var_Create (mp, "vmem-unlock", VLC_VAR_ADDRESS);
+    var_Create (mp, "vmem-display", VLC_VAR_ADDRESS);
+    var_Create (mp, "vmem-data", VLC_VAR_ADDRESS);
+    var_Create (mp, "vmem-chroma", VLC_VAR_STRING | VLC_VAR_DOINHERIT);
+    var_Create (mp, "vmem-width", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
+    var_Create (mp, "vmem-height", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
+    var_Create (mp, "vmem-width", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT);
     var_Create (mp, "drawable-xid", VLC_VAR_INTEGER);
 #ifdef WIN32
     var_Create (mp, "drawable-hwnd", VLC_VAR_ADDRESS);
@@ -767,6 +775,29 @@ void libvlc_media_player_stop( libvlc_media_player_t *p_mi )
     unlock_input(p_mi);
 }
 
+
+void libvlc_video_set_callbacks( libvlc_media_player_t *mp,
+    void *(*lock_cb) (void *, void **),
+    void (*unlock_cb) (void *, void *, void *const *),
+    void (*display_cb) (void *, void *),
+    void *opaque )
+{
+    var_SetAddress( mp, "vmem-lock", lock_cb );
+    var_SetAddress( mp, "vmem-unlock", unlock_cb );
+    var_SetAddress( mp, "vmem-display", display_cb );
+    var_SetAddress( mp, "vmem-data", opaque );
+    var_SetString( mp, "vout", "vmem" );
+}
+
+void libvlc_video_set_format( libvlc_media_player_t *mp, const char *chroma,
+                              unsigned width, unsigned height, unsigned pitch )
+{
+    var_SetString( mp, "vmem-chroma", chroma );
+    var_SetInteger( mp, "vmem-width", width );
+    var_SetInteger( mp, "vmem-height", height );
+    var_SetInteger( mp, "vmem-pitch", pitch );
+}
+
 /**************************************************************************
  * set_nsobject
  **************************************************************************/
diff --git a/src/libvlc.sym b/src/libvlc.sym
index 0148c11..f05d463 100644
--- a/src/libvlc.sym
+++ b/src/libvlc.sym
@@ -202,6 +202,8 @@ libvlc_video_set_subtitle_file
 libvlc_video_set_teletext
 libvlc_video_set_track
 libvlc_video_take_snapshot
+libvlc_video_set_callbacks
+libvlc_video_set_format
 libvlc_vlm_add_broadcast
 libvlc_vlm_add_vod
 libvlc_vlm_add_input



More information about the vlc-commits mailing list