[vlc-devel] commit: Added picture_Export (internal) helper. (Laurent Aimar )

git version control git at videolan.org
Sun Mar 8 14:18:08 CET 2009


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Sat Mar  7 22:56:09 2009 +0100| [66603abb3c0540f98b443dfdab4714348b38f70b] | committer: Laurent Aimar 

Added picture_Export (internal) helper.

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

 include/vlc_vout.h               |   15 ++++++++
 src/libvlccore.sym               |    1 +
 src/video_output/vout_internal.h |    4 --
 src/video_output/vout_pictures.c |   72 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 88 insertions(+), 4 deletions(-)

diff --git a/include/vlc_vout.h b/include/vlc_vout.h
index c322288..71fae39 100644
--- a/include/vlc_vout.h
+++ b/include/vlc_vout.h
@@ -209,6 +209,21 @@ static inline void picture_Copy( picture_t *p_dst, const picture_t *p_src )
 }
 
 /**
+ * This function will export a picture to an encoded bitstream.
+ *
+ * pp_image will contain the encoded bitstream in psz_format format.
+ *
+ * p_fmt can be NULL otherwise it will be set with the format used for the
+ * picture before encoding.
+ *
+ * i_override_width/height allow to override the width and/or the height of the
+ * picture to be encoded. If at most one of them is > 0 then the picture aspect
+ * ratio will be kept.
+ */
+VLC_EXPORT( int, picture_Export, ( vlc_object_t *p_obj, block_t **pp_image, video_format_t *p_fmt, picture_t *p_picture, vlc_fourcc_t i_format, int i_override_width, int i_override_height ) );
+
+
+/**
  * Video picture heap, either render (to store pictures used
  * by the decoder) or output (to store pictures displayed by the vout plugin)
  */
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index c93a159..ef489e3 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -271,6 +271,7 @@ __osd_Volume
 path_sanitize
 picture_CopyPixels
 picture_Delete
+picture_Export
 picture_New
 plane_CopyPixels
 playlist_Add
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index a2ef5e7..8b9a578 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -107,10 +107,6 @@ picture_t *vout_RenderPicture( vout_thread_t *, picture_t *,
  */
 void vout_UsePictureLocked( vout_thread_t *p_vout, picture_t *p_pic  );
 
-
-/*
- * DO NOT use vout_UsePictureLocked unless you are in src/video_ouput.
- */
 int vout_Snapshot( vout_thread_t *, picture_t *p_pic );
 
 #endif
diff --git a/src/video_output/vout_pictures.c b/src/video_output/vout_pictures.c
index 9c11144..759f5db 100644
--- a/src/video_output/vout_pictures.c
+++ b/src/video_output/vout_pictures.c
@@ -36,6 +36,9 @@
 #include <vlc_vout.h>
 #include <vlc_osd.h>
 #include <vlc_filter.h>
+#include <vlc_image.h>
+#include <vlc_block.h>
+
 #include "vout_pictures.h"
 #include "vout_internal.h"
 
@@ -1111,4 +1114,73 @@ void plane_CopyPixels( plane_t *p_dst, const plane_t *p_src )
 /*****************************************************************************
  *
  *****************************************************************************/
+int picture_Export( vlc_object_t *p_obj,
+                    block_t **pp_image,
+                    video_format_t *p_fmt,
+                    picture_t *p_picture,
+                    vlc_fourcc_t i_format,
+                    int i_override_width, int i_override_height )
+{
+    /* */
+    video_format_t fmt_in = p_picture->format;
+    if( fmt_in.i_sar_num <= 0 || fmt_in.i_sar_den <= 0 )
+    {
+        fmt_in.i_sar_num =
+        fmt_in.i_sar_den = 1;
+    }
+
+    /* */
+    video_format_t fmt_out;
+    memset( &fmt_out, 0, sizeof(fmt_out) );
+    fmt_out.i_sar_num =
+    fmt_out.i_sar_den = 1;
+    fmt_out.i_chroma  = i_format;
+    fmt_out.i_width   = i_override_width;
+    fmt_out.i_height  = i_override_height;
+
+    if( fmt_out.i_height == 0 && fmt_out.i_width > 0 )
+    {
+        fmt_out.i_height = fmt_in.i_height * fmt_out.i_width / fmt_in.i_width;
+        const int i_height = fmt_out.i_height * fmt_in.i_sar_den / fmt_in.i_sar_num;
+        if( i_height > 0 )
+            fmt_out.i_height = i_height;
+    }
+    else
+    {
+        if( fmt_out.i_width == 0 && fmt_out.i_height > 0 )
+        {
+            fmt_out.i_width = fmt_in.i_width * fmt_out.i_height / fmt_in.i_height;
+        }
+        else
+        {
+            fmt_out.i_width = fmt_in.i_width;
+            fmt_out.i_height = fmt_in.i_height;
+        }
+        const int i_width = fmt_out.i_width * fmt_in.i_sar_num / fmt_in.i_sar_den;
+        if( i_width > 0 )
+            fmt_out.i_width = i_width;
+    }
+
+    image_handler_t *p_image = image_HandlerCreate( p_obj );
+
+    block_t *p_block = image_Write( p_image, p_picture, &fmt_in, &fmt_out );
+
+    image_HandlerDelete( p_image );
+
+    if( !p_block )
+        return VLC_EGENERIC;
+
+    p_block->i_pts =
+    p_block->i_dts = p_picture->date;
+
+    if( p_fmt )
+        *p_fmt = fmt_out;
+    *pp_image = p_block;
+
+    return VLC_SUCCESS;
+}
+
+/*****************************************************************************
+ *
+ *****************************************************************************/
 




More information about the vlc-devel mailing list