# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <vlc_common.h>
+#include <vlc_plugin.h>
#include <vlc_codec.h>
#include <vlc_vout.h>
#include <vlc_sout.h>
"Enforce a quality between 1 (low) and 10 (high), instead " \
"of specifying a particular bitrate. This will produce a VBR stream." )
-vlc_module_begin();
- set_category( CAT_INPUT );
- set_subcategory( SUBCAT_INPUT_VCODEC );
- set_shortname( "Theora" );
- set_description( _("Theora video decoder") );
- set_capability( "decoder", 100 );
- set_callbacks( OpenDecoder, CloseDecoder );
- add_shortcut( "theora" );
-
- add_submodule();
- set_description( _("Theora video packetizer") );
- set_capability( "packetizer", 100 );
- set_callbacks( OpenPacketizer, CloseDecoder );
-
- add_submodule();
- set_description( _("Theora video encoder") );
- set_capability( "encoder", 150 );
- set_callbacks( OpenEncoder, CloseEncoder );
+vlc_module_begin ()
+ set_category( CAT_INPUT )
+ set_subcategory( SUBCAT_INPUT_VCODEC )
+ set_shortname( "Theora" )
+ set_description( N_("Theora video decoder") )
+ set_capability( "decoder", 100 )
+ set_callbacks( OpenDecoder, CloseDecoder )
+ add_shortcut( "theora" )
+
+ add_submodule ()
+ set_description( N_("Theora video packetizer") )
+ set_capability( "packetizer", 100 )
+ set_callbacks( OpenPacketizer, CloseDecoder )
+
+ add_submodule ()
+ set_description( N_("Theora video encoder") )
+ set_capability( "encoder", 150 )
+ set_callbacks( OpenEncoder, CloseEncoder )
# define ENC_CFG_PREFIX "sout-theora-"
add_integer( ENC_CFG_PREFIX "quality", 2, NULL, ENC_QUALITY_TEXT,
ENC_QUALITY_LONGTEXT, false );
-vlc_module_end();
+vlc_module_end ()
-static const char *ppsz_enc_options[] = {
+static const char *const ppsz_enc_options[] = {
"quality", NULL
};
/* Allocate the memory needed to store the decoder's structure */
if( ( p_dec->p_sys = p_sys =
(decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
- {
- msg_Err( p_dec, "out of memory" );
- return VLC_EGENERIC;
- }
+ return VLC_ENOMEM;
p_dec->p_sys->b_packetizer = false;
p_sys->i_pts = 0;
}
/* Set output properties */
+ switch( p_sys->ti.pixelformat )
+ {
+ case OC_PF_420:
+ p_dec->fmt_out.i_codec = VLC_FOURCC( 'I','4','2','0' );
+ break;
+ case OC_PF_422:
+ p_dec->fmt_out.i_codec = VLC_FOURCC( 'I','4','2','2' );
+ break;
+ case OC_PF_444:
+ p_dec->fmt_out.i_codec = VLC_FOURCC( 'I','4','4','4' );
+ break;
+ case OC_PF_RSVD:
+ default:
+ msg_Err( p_dec, "unknown chroma in theora sample" );
+ break;
+ }
p_dec->fmt_out.video.i_width = p_sys->ti.width;
p_dec->fmt_out.video.i_height = p_sys->ti.height;
if( p_sys->ti.frame_width && p_sys->ti.frame_height )
{
- p_dec->fmt_out.video.i_width = p_sys->ti.frame_width;
- p_dec->fmt_out.video.i_height = p_sys->ti.frame_height;
+ p_dec->fmt_out.video.i_visible_width = p_sys->ti.frame_width;
+ p_dec->fmt_out.video.i_visible_height = p_sys->ti.frame_height;
+ if( p_sys->ti.offset_x || p_sys->ti.offset_y )
+ {
+ p_dec->fmt_out.video.i_x_offset = p_sys->ti.offset_x;
+ p_dec->fmt_out.video.i_y_offset = p_sys->ti.offset_y;
+ }
}
if( p_sys->ti.aspect_denominator && p_sys->ti.aspect_numerator )
return NULL;
/* Get a new picture */
- p_pic = p_dec->pf_vout_buffer_new( p_dec );
+ p_pic = decoder_NewPicture( p_dec );
if( !p_pic ) return NULL;
theora_CopyPicture( p_dec, p_pic, &yuv );
}
/*****************************************************************************
- * ParseTheoraComments: FIXME should be done in demuxer
+ * ParseTheoraComments:
*****************************************************************************/
static void ParseTheoraComments( decoder_t *p_dec )
{
- input_thread_t *p_input = (input_thread_t *)p_dec->p_parent;
char *psz_name, *psz_value, *psz_comment;
int i = 0;
- if( p_input->i_object_type != VLC_OBJECT_INPUT ) return;
-
while ( i < p_dec->p_sys->tc.comments )
{
psz_comment = strdup( p_dec->p_sys->tc.user_comments[i] );
if( !psz_comment )
- {
- msg_Warn( p_dec, "out of memory" );
break;
- }
psz_name = psz_comment;
psz_value = strchr( psz_comment, '=' );
if( psz_value )
{
*psz_value = '\0';
psz_value++;
- input_Control( p_input, INPUT_ADD_INFO, _("Theora comment"),
- psz_name, "%s", psz_value );
+
+ if( !p_dec->p_description )
+ p_dec->p_description = vlc_meta_New();
+ if( p_dec->p_description )
+ vlc_meta_AddExtra( p_dec->p_description, psz_name, psz_value );
}
free( psz_comment );
i++;
static void theora_CopyPicture( decoder_t *p_dec, picture_t *p_pic,
yuv_buffer *yuv )
{
- int i_plane, i_line, i_width, i_dst_stride, i_src_stride;
- int i_src_xoffset, i_src_yoffset;
+ int i_plane, i_line, i_dst_stride, i_src_stride;
uint8_t *p_dst, *p_src;
for( i_plane = 0; i_plane < p_pic->i_planes; i_plane++ )
{
p_dst = p_pic->p[i_plane].p_pixels;
p_src = i_plane ? (i_plane - 1 ? yuv->v : yuv->u ) : yuv->y;
- i_width = p_pic->p[i_plane].i_visible_pitch;
i_dst_stride = p_pic->p[i_plane].i_pitch;
i_src_stride = i_plane ? yuv->uv_stride : yuv->y_stride;
- i_src_xoffset = p_dec->p_sys->ti.offset_x;
- i_src_yoffset = p_dec->p_sys->ti.offset_y;
- if( i_plane )
- {
- i_src_xoffset /= 2;
- i_src_yoffset /= 2;
- }
- p_src += (i_src_yoffset * i_src_stride + i_src_xoffset);
-
- for( i_line = 0; i_line < p_pic->p[i_plane].i_visible_lines; i_line++ )
+ for( i_line = 0; i_line < p_pic->p[i_plane].i_lines; i_line++ )
{
- p_dec->p_libvlc->pf_memcpy( p_dst, p_src + i_src_xoffset,
- i_plane ? yuv->uv_width : yuv->y_width );
+ vlc_memcpy( p_dst, p_src,
+ i_plane ? yuv->uv_width : yuv->y_width );
p_src += i_src_stride;
p_dst += i_dst_stride;
}
/* Allocate the memory needed to store the decoder's structure */
if( ( p_sys = (encoder_sys_t *)malloc(sizeof(encoder_sys_t)) ) == NULL )
- {
- msg_Err( p_enc, "out of memory" );
- return VLC_EGENERIC;
- }
+ return VLC_ENOMEM;
p_enc->p_sys = p_sys;
p_enc->pf_encode_video = Encode;