[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