Commit 66603abb authored by Laurent Aimar's avatar Laurent Aimar

Added picture_Export (internal) helper.

parent 5a604332
...@@ -208,6 +208,21 @@ static inline void picture_Copy( picture_t *p_dst, const picture_t *p_src ) ...@@ -208,6 +208,21 @@ static inline void picture_Copy( picture_t *p_dst, const picture_t *p_src )
picture_CopyProperties( p_dst, 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 * Video picture heap, either render (to store pictures used
* by the decoder) or output (to store pictures displayed by the vout plugin) * by the decoder) or output (to store pictures displayed by the vout plugin)
......
...@@ -271,6 +271,7 @@ __osd_Volume ...@@ -271,6 +271,7 @@ __osd_Volume
path_sanitize path_sanitize
picture_CopyPixels picture_CopyPixels
picture_Delete picture_Delete
picture_Export
picture_New picture_New
plane_CopyPixels plane_CopyPixels
playlist_Add playlist_Add
......
...@@ -107,10 +107,6 @@ picture_t *vout_RenderPicture( vout_thread_t *, picture_t *, ...@@ -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 ); 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 ); int vout_Snapshot( vout_thread_t *, picture_t *p_pic );
#endif #endif
......
...@@ -36,6 +36,9 @@ ...@@ -36,6 +36,9 @@
#include <vlc_vout.h> #include <vlc_vout.h>
#include <vlc_osd.h> #include <vlc_osd.h>
#include <vlc_filter.h> #include <vlc_filter.h>
#include <vlc_image.h>
#include <vlc_block.h>
#include "vout_pictures.h" #include "vout_pictures.h"
#include "vout_internal.h" #include "vout_internal.h"
...@@ -1111,4 +1114,73 @@ void plane_CopyPixels( plane_t *p_dst, const plane_t *p_src ) ...@@ -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;
}
/*****************************************************************************
*
*****************************************************************************/
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment