]> git.sesse.net Git - vlc/commitdiff
Added picture_Export (internal) helper.
authorLaurent Aimar <fenrir@videolan.org>
Sat, 7 Mar 2009 21:56:09 +0000 (22:56 +0100)
committerLaurent Aimar <fenrir@videolan.org>
Sun, 8 Mar 2009 13:12:04 +0000 (14:12 +0100)
include/vlc_vout.h
src/libvlccore.sym
src/video_output/vout_internal.h
src/video_output/vout_pictures.c

index c322288805c40bd397e7c27a96163f08294b76f8..71fae395f1b33ceebf97dc7d13fc840e65084f02 100644 (file)
@@ -208,6 +208,21 @@ static inline void picture_Copy( picture_t *p_dst, const picture_t *p_src )
     picture_CopyProperties( p_dst, 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)
index c93a159390831038173f2486808dc721febbd7f1..ef489e36ff204021032003fc17621cca92db84c7 100644 (file)
@@ -271,6 +271,7 @@ __osd_Volume
 path_sanitize
 picture_CopyPixels
 picture_Delete
+picture_Export
 picture_New
 plane_CopyPixels
 playlist_Add
index a2ef5e736a62bef35d4618e55d717933232cdacf..8b9a578e49ae4df529ab99bd997da6f41ef325e1 100644 (file)
@@ -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
index 9c111445ac889c086973463cf6d9ad61bda9eadb..759f5db842daeed89ffed9e2ed7ca7b74f64b828 100644 (file)
@@ -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;
+}
+
+/*****************************************************************************
+ *
+ *****************************************************************************/