Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
5a8df6b0
Commit
5a8df6b0
authored
Aug 29, 2003
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* all: removed old encoding way.
parent
ecc97852
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
1 addition
and
1348 deletions
+1
-1348
Makefile.am
Makefile.am
+0
-1
configure.ac
configure.ac
+1
-12
include/encoder.h
include/encoder.h
+0
-82
modules/encoder/.cvsignore
modules/encoder/.cvsignore
+0
-11
modules/encoder/Modules.am
modules/encoder/Modules.am
+0
-1
modules/encoder/ffmpeg/.cvsignore
modules/encoder/ffmpeg/.cvsignore
+0
-11
modules/encoder/ffmpeg/Modules.am
modules/encoder/ffmpeg/Modules.am
+0
-6
modules/encoder/ffmpeg/audio.c
modules/encoder/ffmpeg/audio.c
+0
-64
modules/encoder/ffmpeg/encoder.c
modules/encoder/ffmpeg/encoder.c
+0
-68
modules/encoder/ffmpeg/video.c
modules/encoder/ffmpeg/video.c
+0
-314
modules/encoder/xvid.c
modules/encoder/xvid.c
+0
-357
modules/video_output/encoder.c
modules/video_output/encoder.c
+0
-421
No files found.
Makefile.am
View file @
5a8df6b0
...
...
@@ -71,7 +71,6 @@ HEADERS_include = \
include/darwin_specific.h
\
include/charset.h
\
include/codecs.h
\
include/encoder.h
\
include/ninput.h
\
include/input_ext-dec.h
\
include/input_ext-intf.h
\
...
...
configure.ac
View file @
5a8df6b0
dnl Autoconf settings for vlc
dnl $Id: configure.ac,v 1.
69 2003/08/27 08:27:52 gbazin
Exp $
dnl $Id: configure.ac,v 1.
70 2003/08/29 19:50:12 fenrir
Exp $
AC_INIT(vlc,0.6.3-cvs)
...
...
@@ -1621,11 +1621,6 @@ then
fi
fi
dnl Duplicate the ffmpeg CPPFLAGS and LDFLAGS for the encoder
AX_ADD_CPPFLAGS([encoder_ffmpeg],[${CPPFLAGS_ffmpeg}])
dnl XXX: we don't link with -lavcodec blah blah blah
dnl AX_ADD_LDFLAGS([encoder_ffmpeg],[${LDFLAGS_ffmpeg}])
ac_have_vorbis_headers=yes
AC_CHECK_HEADERS(vorbis/vorbisenc.h vorbis/codec.h,,
ac_have_vorbis_headers=no)
...
...
@@ -1743,10 +1738,6 @@ then
LDFLAGS="${LDFLAGS_save}"
CPPFLAGS="${CPPFLAGS_save}"
fi
dnl Duplicate the xvid CPPFLAGS and LDFLAGS for the encoder
AX_ADD_LDFLAGS([encoder_xvid],[${LDFLAGS_xvid}])
AX_ADD_CPPFLAGS([encoder_xvid],[${CPPFLAGS_xvid}])
fi
dnl
...
...
@@ -3318,8 +3309,6 @@ AC_OUTPUT([
modules/demux/mp4/Makefile
modules/demux/mpeg/Makefile
modules/demux/util/Makefile
modules/encoder/Makefile
modules/encoder/ffmpeg/Makefile
modules/gui/Makefile
modules/gui/beos/Makefile
modules/gui/pda/Makefile
...
...
include/encoder.h
deleted
100644 → 0
View file @
ecc97852
/*****************************************************************************
* encoder.h :
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: encoder.h,v 1.1 2003/01/22 10:41:57 fenrir Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#ifndef _ENCODER_H
#define _ENCODER_H
typedef
struct
encoder_sys_t
encoder_sys_t
;
typedef
struct
video_encoder_s
{
VLC_COMMON_MEMBERS
module_t
*
p_module
;
vlc_fourcc_t
i_codec
;
/* in */
vlc_fourcc_t
i_chroma
;
/* in/out */
int
i_width
;
/* in/out */
int
i_height
;
/* in/out */
int
i_aspect
;
/* in/out */
size_t
i_buffer_size
;
/* in/out */
encoder_sys_t
*
p_sys
;
int
(
*
pf_init
)
(
struct
video_encoder_s
*
p_enc
);
int
(
*
pf_encode
)
(
struct
video_encoder_s
*
p_enc
,
picture_t
*
p_pic
,
void
*
p_data
,
size_t
*
pi_data
);
void
(
*
pf_end
)
(
struct
video_encoder_s
*
p_enc
);
}
video_encoder_t
;
/*
* Video decoder:
*
* = at loading a video decoder must
* * see if i_codec is supporte, if not => failling
* * modify i_width/i_height/i_chroma/i_aspect if required (for example,
* if a video codec required %8 size)
* * init/check the library
* * set pf_init, pf_encode and pf_end
* * set i_buffer_size to the max buffer size required to output a single frame
*
* = pf_init must
* * start encoding processing
* * doesn't change any parameters (i_chroma/i_width/i_height/i_aspect)
* * check for passed parameters (no one for the moment)
*
* = pf_encode must
* * encode a single frame
* * doesn't change any parameters (...)
* * doesn't look for passed paramters
*
* = pf_end must
* * end the encoding process
* * revert all that pf_init (and pf_encode) has done (memory...)
*
* = at unloading, a video decoder must revert all that was done while loading
*
* XXX: pf_init/pf_end could be called multiple time without the plugin unloaded.
* XXX: all memory allocated by video encoder MUST be unallocated by video encoder
*
*/
#endif
modules/encoder/.cvsignore
deleted
100644 → 0
View file @
ecc97852
.deps
.dirstamp
*.lo
*.la
*.dll
*.dylib
*.sl
*.so
Makefile.am
Makefile.in
Makefile
modules/encoder/Modules.am
deleted
100644 → 0
View file @
ecc97852
SOURCES_encoder_xvid = xvid.c
modules/encoder/ffmpeg/.cvsignore
deleted
100644 → 0
View file @
ecc97852
.deps
.dirstamp
*.lo
*.la
*.dll
*.dylib
*.sl
*.so
Makefile.am
Makefile.in
Makefile
modules/encoder/ffmpeg/Modules.am
deleted
100644 → 0
View file @
ecc97852
SOURCES_encoder_ffmpeg = \
encoder.c \
video.c \
audio.c \
$(NULL)
modules/encoder/ffmpeg/audio.c
deleted
100644 → 0
View file @
ecc97852
/*****************************************************************************
* audio.c : audio encoder using ffmpeg library
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: audio.c,v 1.2 2003/04/20 11:57:13 gbazin Exp $
*
* Authors: Laurent Aimar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <vlc/vlc.h>
#include <vlc/vout.h>
#include <vlc/input.h>
#include <vlc/decoder.h>
#include <stdlib.h>
#include "codecs.h"
/* ffmpeg header */
#ifdef HAVE_FFMPEG_AVCODEC_H
# include <ffmpeg/avcodec.h>
#else
# include <avcodec.h>
#endif
/*****************************************************************************
* Local prototypes
*****************************************************************************/
int
E_
(
OpenEncoderAudio
)
(
vlc_object_t
*
);
void
E_
(
CloseEncoderAudio
)(
vlc_object_t
*
);
struct
encoder_sys_t
{
void
*
audio_handle
;
};
int
E_
(
OpenEncoderAudio
)
(
vlc_object_t
*
p_this
)
{
return
VLC_EGENERIC
;
}
void
E_
(
CloseEncoderAudio
)(
vlc_object_t
*
p_this
)
{
;
}
modules/encoder/ffmpeg/encoder.c
deleted
100644 → 0
View file @
ecc97852
/*****************************************************************************
* encoder.c : audio/video encoder using ffmpeg library
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: encoder.c,v 1.4 2003/04/27 23:16:35 gbazin Exp $
*
* Authors: Laurent Aimar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <vlc/vlc.h>
#include <vlc/vout.h>
#include <vlc/input.h>
#include <vlc/decoder.h>
#include <stdlib.h>
#include "codecs.h"
#include "encoder.h"
/*****************************************************************************
* Local prototypes
*****************************************************************************/
int
E_
(
OpenEncoderVideo
)(
vlc_object_t
*
);
void
E_
(
CloseEncoderVideo
)(
vlc_object_t
*
);
int
E_
(
OpenEncoderAudio
)
(
vlc_object_t
*
);
void
E_
(
CloseEncoderAudio
)(
vlc_object_t
*
);
/*****************************************************************************
* Module descriptor
*****************************************************************************/
vlc_module_begin
();
set_description
(
_
(
"ffmpeg video encoder"
)
);
add_shortcut
(
"ffmpeg"
);
set_capability
(
"video encoder"
,
100
);
set_callbacks
(
E_
(
OpenEncoderVideo
),
E_
(
CloseEncoderVideo
)
);
add_category_hint
(
"video setting"
,
NULL
,
VLC_TRUE
);
add_integer
(
"encoder-ffmpeg-video-bitrate"
,
1000
,
NULL
,
"bitrate (kb/s)"
,
"bitrate (kb/s)"
,
VLC_TRUE
);
add_integer
(
"encoder-ffmpeg-video-max-key-interval"
,
10
,
NULL
,
"max key interval"
,
"maximum value of frames between two keyframes"
,
VLC_TRUE
);
add_integer
(
"encoder-ffmpeg-video-min-quant"
,
2
,
NULL
,
"min quantizer"
,
"range 1-31"
,
VLC_TRUE
);
add_integer
(
"encoder-ffmpeg-video-max-quant"
,
31
,
NULL
,
"max quantizer"
,
"range 1-31"
,
VLC_TRUE
);
add_submodule
();
set_description
(
_
(
"ffmpeg audio encoder"
)
);
set_capability
(
"audio encoder"
,
50
);
set_callbacks
(
E_
(
OpenEncoderAudio
),
E_
(
CloseEncoderAudio
)
);
add_category_hint
(
"audio setting"
,
NULL
,
VLC_TRUE
);
add_integer
(
"encoder-ffmpeg-audio-bitrate"
,
64
,
NULL
,
"bitrate (kb/s)"
,
"bitrate (kb/s)"
,
VLC_TRUE
);
vlc_module_end
();
modules/encoder/ffmpeg/video.c
deleted
100644 → 0
View file @
ecc97852
/*****************************************************************************
* video.c : video encoder using ffmpeg library
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: video.c,v 1.5 2003/07/28 20:25:30 jpsaman Exp $
*
* Authors: Laurent Aimar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <vlc/vlc.h>
#include <vlc/vout.h>
#include <vlc/input.h>
#include <vlc/decoder.h>
#include <stdlib.h>
#include "codecs.h"
#include "encoder.h"
/* ffmpeg header */
#ifdef HAVE_FFMPEG_AVCODEC_H
# include <ffmpeg/avcodec.h>
#else
# include <avcodec.h>
#endif
int
E_
(
OpenEncoderVideo
)
(
vlc_object_t
*
);
void
E_
(
CloseEncoderVideo
)(
vlc_object_t
*
);
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
Init
(
video_encoder_t
*
p_encoder
);
static
int
Encode
(
video_encoder_t
*
p_encoder
,
picture_t
*
p_pic
,
void
*
p_data
,
size_t
*
pi_data
);
static
void
End
(
video_encoder_t
*
p_encoder
);
/*****************************************************************************
* Local definitions
*****************************************************************************/
struct
encoder_sys_t
{
char
*
psz_codec
;
AVCodecContext
*
p_context
;
AVCodec
*
p_codec
;
AVFrame
*
p_frame
;
};
/*****************************************************************************
* OpenEncoderVideo:
*****************************************************************************
*
*****************************************************************************/
int
E_
(
OpenEncoderVideo
)
(
vlc_object_t
*
p_this
)
{
video_encoder_t
*
p_encoder
=
(
video_encoder_t
*
)
p_this
;
/* *** check supported codec *** */
switch
(
p_encoder
->
i_codec
)
{
case
VLC_FOURCC
(
'm'
,
'p'
,
'1'
,
'v'
):
case
VLC_FOURCC
(
'm'
,
'p'
,
'g'
,
'v'
):
case
VLC_FOURCC
(
'm'
,
'p'
,
'4'
,
'v'
):
case
VLC_FOURCC
(
'h'
,
'u'
,
'f'
,
'f'
):
break
;
default:
return
VLC_EGENERIC
;
}
/* *** init library */
avcodec_init
();
avcodec_register_all
();
/* *** fix parameters *** */
switch
(
p_encoder
->
i_chroma
)
{
/* Planar YUV formats */
case
VLC_FOURCC
(
'I'
,
'4'
,
'4'
,
'4'
):
case
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'2'
):
case
VLC_FOURCC
(
'Y'
,
'V'
,
'1'
,
'2'
):
case
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
):
case
VLC_FOURCC
(
'I'
,
'Y'
,
'U'
,
'V'
):
case
VLC_FOURCC
(
'I'
,
'4'
,
'1'
,
'1'
):
case
VLC_FOURCC
(
'I'
,
'4'
,
'1'
,
'0'
):
/* Packed YUV formats */
case
VLC_FOURCC
(
'Y'
,
'U'
,
'Y'
,
'2'
):
case
VLC_FOURCC
(
'U'
,
'Y'
,
'V'
,
'Y'
):
/* Packed RGB formats */
case
VLC_FOURCC
(
'R'
,
'V'
,
'3'
,
'2'
):
case
VLC_FOURCC
(
'R'
,
'V'
,
'2'
,
'4'
):
case
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'6'
):
case
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'5'
):
case
VLC_FOURCC
(
'R'
,
'G'
,
'B'
,
'2'
):
break
;
default:
return
VLC_EGENERIC
;
}
#if 0
p_encoder->i_width = ( p_encoder->i_width + 15 )&0xfffff8;
p_encoder->i_height = ( p_encoder->i_height + 15 )&0xfffff8;
#endif
/* *** set exported functions *** */
p_encoder
->
pf_init
=
Init
;
p_encoder
->
pf_encode
=
Encode
;
p_encoder
->
pf_end
=
End
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
* CloseEncoderVideo:
*****************************************************************************
*
*****************************************************************************/
void
E_
(
CloseEncoderVideo
)(
vlc_object_t
*
p_this
)
{
;
}
/*****************************************************************************
* Init:
*****************************************************************************
*
*****************************************************************************/
static
int
Init
(
video_encoder_t
*
p_encoder
)
{
encoder_sys_t
*
p_sys
;
int
i_codec
;
/* *** allocate memory *** */
if
(
!
(
p_encoder
->
p_sys
=
p_sys
=
malloc
(
sizeof
(
encoder_sys_t
)
)
)
)
{
msg_Err
(
p_encoder
,
"out of memory"
);
return
VLC_EGENERIC
;
}
memset
(
p_sys
,
0
,
sizeof
(
encoder_sys_t
)
);
/* *** ask for the codec *** */
switch
(
p_encoder
->
i_codec
)
{
case
VLC_FOURCC
(
'm'
,
'p'
,
'1'
,
'v'
):
case
VLC_FOURCC
(
'm'
,
'p'
,
'g'
,
'v'
):
p_encoder
->
p_sys
->
psz_codec
=
"MPEG I"
;
i_codec
=
CODEC_ID_MPEG1VIDEO
;
break
;
case
VLC_FOURCC
(
'm'
,
'p'
,
'4'
,
'v'
):
p_encoder
->
p_sys
->
psz_codec
=
"MPEG-4"
;
i_codec
=
CODEC_ID_MPEG4
;
break
;
case
VLC_FOURCC
(
'h'
,
'u'
,
'f'
,
'f'
):
p_encoder
->
p_sys
->
psz_codec
=
"Huff YUV"
;
i_codec
=
CODEC_ID_HUFFYUV
;
break
;
default:
return
VLC_EGENERIC
;
}
if
(
(
p_sys
->
p_codec
=
avcodec_find_encoder
(
i_codec
)
)
==
NULL
)
{
msg_Err
(
p_encoder
,
"cannot find encoder for %s"
,
p_encoder
->
p_sys
->
psz_codec
);
return
VLC_EGENERIC
;
}
msg_Dbg
(
p_encoder
,
"encoding with %s"
,
p_encoder
->
p_sys
->
psz_codec
);
#define p_frame p_sys->p_frame
#define p_context p_sys->p_context
/* *** set context properties *** */
p_context
=
avcodec_alloc_context
();
p_context
->
bit_rate
=
config_GetInt
(
p_encoder
,
"encoder-ffmpeg-video-bitrate"
)
*
1000
;
p_context
->
width
=
p_encoder
->
i_width
;
p_context
->
height
=
p_encoder
->
i_height
;
#if LIBAVCODEC_BUILD >= 4662
p_context
->
frame_rate
=
25
*
DEFAULT_FRAME_RATE_BASE
;
#else
p_context
->
frame_rate
=
25
*
FRAME_RATE_BASE
;
#endif
p_context
->
gop_size
=
config_GetInt
(
p_encoder
,
"encoder-ffmpeg-video-max-key-interval"
);
p_context
->
qmin
=
__MAX
(
__MIN
(
config_GetInt
(
p_encoder
,
"encoder-ffmpeg-video-min-quant"
),
31
),
1
);
p_context
->
qmax
=
__MAX
(
__MIN
(
config_GetInt
(
p_encoder
,
"encoder-ffmpeg-video-max-quant"
),
31
),
1
);
if
(
avcodec_open
(
p_context
,
p_encoder
->
p_sys
->
p_codec
)
<
0
)
{
msg_Err
(
p_encoder
,
"failed to open %s codec"
,
p_encoder
->
p_sys
->
psz_codec
);
return
VLC_EGENERIC
;
}
p_frame
=
avcodec_alloc_frame
();
switch
(
p_encoder
->
i_chroma
)
{
/* Planar YUV formats */
case
VLC_FOURCC
(
'I'
,
'4'
,
'4'
,
'4'
):
p_frame
->
pict_type
=
PIX_FMT_YUV444P
;
break
;
case
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'2'
):
p_frame
->
pict_type
=
PIX_FMT_YUV422P
;
break
;
case
VLC_FOURCC
(
'Y'
,
'V'
,
'1'
,
'2'
):
case
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
):
case
VLC_FOURCC
(
'I'
,
'Y'
,
'U'
,
'V'
):
p_frame
->
pict_type
=
PIX_FMT_YUV420P
;
break
;
case
VLC_FOURCC
(
'I'
,
'4'
,
'1'
,
'1'
):
p_frame
->
pict_type
=
PIX_FMT_YUV411P
;
break
;
case
VLC_FOURCC
(
'I'
,
'4'
,
'1'
,
'0'
):
p_frame
->
pict_type
=
PIX_FMT_YUV410P
;
break
;
/* Packed YUV formats */
case
VLC_FOURCC
(
'Y'
,
'U'
,
'Y'
,
'2'
):
case
VLC_FOURCC
(
'U'
,
'Y'
,
'V'
,
'Y'
):
p_frame
->
pict_type
=
PIX_FMT_YUV422
;
break
;
/* Packed RGB formats */
case
VLC_FOURCC
(
'R'
,
'V'
,
'3'
,
'2'
):
p_frame
->
pict_type
=
PIX_FMT_RGBA32
;
break
;
case
VLC_FOURCC
(
'R'
,
'V'
,
'2'
,
'4'
):
p_frame
->
pict_type
=
PIX_FMT_RGB24
;
//p_frame->pict_type = PIX_FMT_BGR24;
break
;
case
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'6'
):
p_frame
->
pict_type
=
PIX_FMT_RGB565
;
break
;
case
VLC_FOURCC
(
'R'
,
'V'
,
'1'
,
'5'
):
p_frame
->
pict_type
=
PIX_FMT_RGB555
;
break
;
case
VLC_FOURCC
(
'R'
,
'G'
,
'B'
,
'2'
):
p_frame
->
pict_type
=
PIX_FMT_GRAY8
;
break
;
default:
return
VLC_EGENERIC
;
}
return
VLC_SUCCESS
;
#undef p_context
#undef p_frame
}
/*****************************************************************************
* Encode:
*****************************************************************************
*
*****************************************************************************/
static
int
Encode
(
video_encoder_t
*
p_encoder
,
picture_t
*
p_pic
,
void
*
p_data
,
size_t
*
pi_data
)
{
#define p_frame p_encoder->p_sys->p_frame
#define p_context p_encoder->p_sys->p_context
int
i
;
for
(
i
=
0
;
i
<
p_pic
->
i_planes
;
i
++
)
{
p_frame
->
linesize
[
i
]
=
p_pic
->
p
[
i
].
i_pitch
;
p_frame
->
data
[
i
]
=
p_pic
->
p
[
i
].
p_pixels
;
}
*
pi_data
=
avcodec_encode_video
(
p_context
,
p_data
,
*
pi_data
,
p_frame
);
return
VLC_SUCCESS
;
#undef p_context
#undef p_frame
}
/*****************************************************************************
* End:
*****************************************************************************
*
*****************************************************************************/
static
void
End
(
video_encoder_t
*
p_encoder
)
{
avcodec_close
(
p_encoder
->
p_sys
->
p_context
);
free
(
p_encoder
->
p_sys
->
p_context
);
p_encoder
->
p_sys
->
p_context
=
NULL
;
p_encoder
->
p_sys
->
p_codec
=
NULL
;
}
modules/encoder/xvid.c
deleted
100644 → 0
View file @
ecc97852
/*****************************************************************************
* xvid.c: an encoder for libxvidcore, the Xvid video codec
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: xvid.c,v 1.3 2003/02/22 16:10:31 fenrir Exp $
*
* Authors: Laurent Aimar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <vlc/vlc.h>
#include <vlc/vout.h>
#include <vlc/input.h>
#include <vlc/decoder.h>
#include <stdlib.h>
#include "codecs.h"
#include "encoder.h"
#include <xvid.h>
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
OpenEncoder
(
vlc_object_t
*
);
static
void
CloseEncoder
(
vlc_object_t
*
);
static
int
Init
(
video_encoder_t
*
p_encoder
);
static
int
Encode
(
video_encoder_t
*
p_encoder
,
picture_t
*
p_pic
,
void
*
p_data
,
size_t
*
pi_data
);
static
void
End
(
video_encoder_t
*
p_encoder
);
/*****************************************************************************
* Module descriptor
*****************************************************************************/
static
char
*
ppsz_xvid_quant_algo
[]
=
{
"MPEG"
,
"H263"
,
NULL
};
static
char
*
ppsz_xvid_me
[]
=
{
""
,
"zero"
,
"logarithmic"
,
"fullsearch"
,
"pmvfast"
,
"epzs"
,
NULL
};
vlc_module_begin
();
set_description
(
_
(
"XviD video encoder (MPEG-4)"
)
);
set_capability
(
"video encoder"
,
50
);
set_callbacks
(
OpenEncoder
,
CloseEncoder
);
add_shortcut
(
"xvid"
);
add_category_hint
(
"general setting"
,
NULL
,
VLC_TRUE
);
add_integer
(
"encoder-xvid-bitrate"
,
1000
,
NULL
,
"bitrate (kb/s)"
,
"bitrate (kb/s)"
,
VLC_TRUE
);
add_integer
(
"encoder-xvid-min-quantizer"
,
2
,
NULL
,
"min quantizer"
,
"range 1-31"
,
VLC_TRUE
);
add_integer
(
"encoder-xvid-max-quantizer"
,
31
,
NULL
,
"max quantizer"
,
"1-31"
,
VLC_TRUE
);
add_integer
(
"encoder-xvid-max-key-interval"
,
-
1
,
NULL
,
"max key interval"
,
"maximum value of frames between two keyframes"
,
VLC_TRUE
);
add_category_hint
(
"advanced setting"
,
NULL
,
VLC_TRUE
);
add_integer
(
"encoder-xvid-reaction-delay-factor"
,
-
1
,
NULL
,
"rc reaction delay factor"
,
"rate controler parameters"
,
VLC_TRUE
);
add_integer
(
"encoder-xvid-averaging-period"
,
-
1
,
NULL
,
"rc averaging period"
,
"rate controler parameters"
,
VLC_TRUE
);
add_integer
(
"encoder-xvid-buffer"
,
-
1
,
NULL
,
"rc buffer"
,
"rate controler parameters"
,
VLC_TRUE
);
add_category_hint
(
"advanced frame setting"
,
NULL
,
VLC_TRUE
);
add_string_from_list
(
"encoder-xvid-quantization"
,
"MPEG"
,
ppsz_xvid_quant_algo
,
NULL
,
"quantization algorithm"
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-halfpel"
,
1
,
NULL
,
"half pixel motion estimation."
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-4mv"
,
0
,
NULL
,
"fourc vector per macroblock(need halfpel)"
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-lumi-mask"
,
0
,
NULL
,
"use a lumimasking algorithm"
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-adaptive-quant"
,
0
,
NULL
,
"perform an adaptative quantization"
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-interlacing"
,
0
,
NULL
,
"use MPEG4 interlaced mode"
,
""
,
VLC_TRUE
);
add_string_from_list
(
"encoder-xvid-me"
,
""
,
ppsz_xvid_me
,
NULL
,
"motion estimation"
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-motion-advanceddiamond"
,
1
,
NULL
,
"motion advanceddiamond"
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-motion-halfpeldiamond"
,
1
,
NULL
,
"motion halfpel diamond"
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-motion-halfpelrefine"
,
1
,
NULL
,
"motion halfpelrefine"
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-motion-extsearch"
,
1
,
NULL
,
"motion extsearch"
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-motion-earlystop"
,
1
,
NULL
,
"motion earlystop"
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-motion-quickstop"
,
1
,
NULL
,
"motion quickstop"
,
""
,
VLC_TRUE
);
add_bool
(
"encoder-xvid-motion-usesquares"
,
0
,
NULL
,
"use a square search"
,
""
,
VLC_TRUE
);
vlc_module_end
();
struct
encoder_sys_t
{
void
*
handle
;
XVID_ENC_FRAME
xframe
;
};
/*****************************************************************************
* OpenEncoder:
*****************************************************************************
* Check the library and init it
* see if it can encode to the requested codec
*****************************************************************************/
static
int
OpenEncoder
(
vlc_object_t
*
p_this
)
{
video_encoder_t
*
p_encoder
=
(
video_encoder_t
*
)
p_this
;
XVID_INIT_PARAM
xinit
;
int
i_err
;
if
(
p_encoder
->
i_codec
!=
VLC_FOURCC
(
'm'
,
'p'
,
'4'
,
'v'
)
)
{
/* unsupported codec */
return
VLC_EGENERIC
;
}
msg_Dbg
(
p_encoder
,
"XviD encoder compiled for API_VERSION:0x%x"
,
API_VERSION
);
/* init the library */
xinit
.
cpu_flags
=
0
;
if
(
(
i_err
=
xvid_init
(
NULL
,
0
,
&
xinit
,
NULL
)
)
!=
XVID_ERR_OK
)
{
msg_Err
(
p_encoder
,
"cannot init xvid library (err:0x%x)"
,
i_err
);
return
VLC_EGENERIC
;
}
/* check API_VERSION */
if
(
xinit
.
api_version
!=
API_VERSION
)
{
msg_Err
(
p_encoder
,
"API_VERSION version mismatch (library:0x%x)"
,
xinit
.
api_version
);
return
VLC_EGENERIC
;
}
msg_Dbg
(
p_encoder
,
"XviD api_version:0x%x core_build:0x%x cpu_flags:0x%x"
,
xinit
.
api_version
,
xinit
.
core_build
,
xinit
.
cpu_flags
);
/* force some parameters */
if
(
p_encoder
->
i_chroma
!=
VLC_FOURCC
(
'Y'
,
'V'
,
'1'
,
'2'
)
&&
p_encoder
->
i_chroma
!=
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
)
)
{
p_encoder
->
i_chroma
=
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
);
}
/* set exported functions */
p_encoder
->
pf_init
=
Init
;
p_encoder
->
pf_encode
=
Encode
;
p_encoder
->
pf_end
=
End
;
return
VLC_SUCCESS
;
}
static
void
CloseEncoder
(
vlc_object_t
*
p_this
)
{
;
}
/*****************************************************************************
* Init:
*****************************************************************************
*
*****************************************************************************/
static
int
Init
(
video_encoder_t
*
p_encoder
)
{
encoder_sys_t
*
p_sys
;
char
*
psz
;
int
i_err
;
XVID_ENC_PARAM
xparam
;
if
(
!
(
p_encoder
->
p_sys
=
p_sys
=
malloc
(
sizeof
(
encoder_sys_t
)
)
)
)
{
msg_Err
(
p_encoder
,
"out of memory"
);
return
VLC_EGENERIC
;
}
memset
(
p_sys
,
0
,
sizeof
(
encoder_sys_t
)
);
/* *** open a instance of the codec *** */
xparam
.
width
=
p_encoder
->
i_width
;
xparam
.
height
=
p_encoder
->
i_height
;
/* framerat = xparam.fbase / xparam.fincr */
xparam
.
fincr
=
1
;
xparam
.
fbase
=
25
;
/* desired bitrate */
xparam
.
rc_bitrate
=
config_GetInt
(
p_encoder
,
"encoder-xvid-bitrate"
)
*
1000
;
/* setting to success in achive xparam.rc_bitrate */
xparam
.
rc_reaction_delay_factor
=
config_GetInt
(
p_encoder
,
"encoder-xvid-reaction-delay-factor"
);
xparam
.
rc_averaging_period
=
config_GetInt
(
p_encoder
,
"encoder-xvid-averaging-period"
);
xparam
.
rc_buffer
=
config_GetInt
(
p_encoder
,
"encoder-xvid-buffer"
);
/* limit the range of allowed quantizers [1..31] */
xparam
.
min_quantizer
=
config_GetInt
(
p_encoder
,
"encoder-xvid-min-quantizer"
);;
xparam
.
min_quantizer
=
__MAX
(
__MIN
(
xparam
.
min_quantizer
,
31
),
1
);
xparam
.
max_quantizer
=
config_GetInt
(
p_encoder
,
"encoder-xvid-max-quantizer"
);
xparam
.
max_quantizer
=
__MAX
(
__MIN
(
xparam
.
max_quantizer
,
31
),
1
);
/* maximum value of frames between two keyframes */
xparam
.
max_key_interval
=
config_GetInt
(
p_encoder
,
"encoder-xvid-max-key-interval"
);
switch
(
xvid_encore
(
NULL
,
XVID_ENC_CREATE
,
&
xparam
,
NULL
)
)
{
case
XVID_ERR_OK
:
msg_Dbg
(
p_encoder
,
"encoder creation successed"
);
break
;
case
XVID_ERR_MEMORY
:
msg_Err
(
p_encoder
,
"encoder creation failed, out of memory"
);
return
VLC_EGENERIC
;
case
XVID_ERR_FORMAT
:
msg_Err
(
p_encoder
,
"encoder creation failed, bad format"
);
return
VLC_EGENERIC
;
case
XVID_ERR_FAIL
:
default:
msg_Err
(
p_encoder
,
"encoder creation failed"
);
return
VLC_EGENERIC
;
}
/* get the handle */
p_sys
->
handle
=
xparam
.
handle
;
/* *** set xframe parameters *** */
#define xframe p_sys->xframe
/* set xframe.general options */
xframe
.
general
=
0
;
psz
=
config_GetPsz
(
p_encoder
,
"encoder-xvid-quantization"
);
if
(
psz
)
{
if
(
!
strcmp
(
psz
,
"H263"
)
)
{
xframe
.
general
|=
XVID_H263QUANT
;
}
else
{
xframe
.
general
|=
XVID_MPEGQUANT
;
}
free
(
psz
);
}
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-halfpel"
)
)
xframe
.
general
|=
XVID_HALFPEL
;
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-4mv"
)
)
xframe
.
general
|=
XVID_INTER4V
;
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-lumi-mask"
)
)
xframe
.
general
|=
XVID_LUMIMASKING
;
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-adaptive-quant"
)
)
xframe
.
general
|=
XVID_ADAPTIVEQUANT
;
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-interlacing"
)
)
xframe
.
general
|=
XVID_INTERLACING
;
psz
=
config_GetPsz
(
p_encoder
,
"encoder-xvid-me"
);
if
(
psz
)
{
if
(
!
strcmp
(
psz
,
"zero"
)
)
{
xframe
.
general
|=
XVID_ME_ZERO
;
}
else
if
(
!
strcmp
(
psz
,
"logarithmic"
)
)
{
xframe
.
general
|=
XVID_ME_LOGARITHMIC
;
}
else
if
(
!
strcmp
(
psz
,
"fullsearch"
)
)
{
xframe
.
general
|=
XVID_ME_FULLSEARCH
;
}
else
if
(
!
strcmp
(
psz
,
"pmvfast"
)
)
{
xframe
.
general
|=
XVID_ME_PMVFAST
;
}
else
if
(
!
strcmp
(
psz
,
"epzs"
)
)
{
xframe
.
general
|=
XVID_ME_EPZS
;
}
free
(
psz
);
}
xframe
.
motion
=
0
;
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-motion-advanceddiamond"
)
)
xframe
.
motion
|=
PMV_ADVANCEDDIAMOND16
|
PMV_ADVANCEDDIAMOND8
;
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-motion-halfpeldiamond"
)
)
xframe
.
motion
|=
PMV_HALFPELDIAMOND16
|
PMV_HALFPELDIAMOND8
;
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-motion-halfpelrefine"
)
)
xframe
.
motion
|=
PMV_HALFPELREFINE16
|
PMV_HALFPELREFINE8
;
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-motion-extsearch"
)
)
xframe
.
motion
|=
PMV_EXTSEARCH16
|
PMV_EXTSEARCH8
;
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-motion-earlystop"
)
)
xframe
.
motion
|=
PMV_EARLYSTOP16
|
PMV_EARLYSTOP8
;
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-motion-quickstop"
)
)
xframe
.
motion
|=
PMV_QUICKSTOP16
|
PMV_QUICKSTOP8
;
if
(
config_GetInt
(
p_encoder
,
"encoder-xvid-motion-usesquares"
)
)
xframe
.
motion
|=
PMV_USESQUARES16
|
PMV_USESQUARES8
;
/* no user quant matrix */
xframe
.
quant_intra_matrix
=
NULL
;
xframe
.
quant_inter_matrix
=
NULL
;
switch
(
p_encoder
->
i_chroma
)
{
case
VLC_FOURCC
(
'Y'
,
'V'
,
'1'
,
'2'
):
xframe
.
colorspace
=
XVID_CSP_YV12
;
case
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
):
xframe
.
colorspace
=
XVID_CSP_I420
;
}
/* != 0 -> force quant */
xframe
.
quant
=
0
;
#undef xframe
return
VLC_SUCCESS
;
}
/*****************************************************************************
* Encode: encode a single frame
*****************************************************************************
*
*****************************************************************************/
static
int
Encode
(
video_encoder_t
*
p_encoder
,
picture_t
*
p_pic
,
void
*
p_data
,
size_t
*
pi_data
)
{
int
i_err
;
#define xframe p_encoder->p_sys->xframe
xframe
.
image
=
p_pic
->
p
->
p_pixels
;
xframe
.
bitstream
=
p_data
;
xframe
.
length
=
-
1
;
/* let codec decided between I-frame and P-frame */
xframe
.
intra
=
-
1
;
i_err
=
xvid_encore
(
p_encoder
->
p_sys
->
handle
,
XVID_ENC_ENCODE
,
&
xframe
,
NULL
);
*
pi_data
=
xframe
.
length
;
#undef xframe
return
VLC_SUCCESS
;
}
/*****************************************************************************
* End
*****************************************************************************
*
*****************************************************************************/
static
void
End
(
video_encoder_t
*
p_encoder
)
{
int
i_err
;
/* *** close the codec */
i_err
=
xvid_encore
(
p_encoder
->
p_sys
->
handle
,
XVID_ENC_DESTROY
,
NULL
,
NULL
);
/* *** free memory */
free
(
p_encoder
->
p_sys
);
msg_Dbg
(
p_encoder
,
"closing encoder (err:0x%x)"
,
i_err
);
return
;
}
modules/video_output/encoder.c
deleted
100644 → 0
View file @
ecc97852
/*****************************************************************************
* encoder.c : encoder wrapper plugin for vlc
*****************************************************************************
* Copyright (C) 2002 VideoLAN
* $Id: encoder.c,v 1.3 2003/03/30 18:14:38 gbazin Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <stdlib.h>
#include <vlc/vlc.h>
#include <vlc/vout.h>
#include <vlc/input.h>
#include "encoder.h"
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
Create
(
vlc_object_t
*
);
static
void
Destroy
(
vlc_object_t
*
);
static
int
Init
(
vout_thread_t
*
);
static
void
End
(
vout_thread_t
*
);
static
int
Manage
(
vout_thread_t
*
);
static
void
Render
(
vout_thread_t
*
,
picture_t
*
);
static
void
Display
(
vout_thread_t
*
,
picture_t
*
);
static
void
SetPalette
(
vout_thread_t
*
,
uint16_t
*
,
uint16_t
*
,
uint16_t
*
);
/*****************************************************************************
* Module descriptor
*****************************************************************************/
vlc_module_begin
();
set_description
(
_
(
"Encoder wrapper"
)
);
set_capability
(
"video output"
,
0
);
set_callbacks
(
Create
,
Destroy
);
add_shortcut
(
"encoder"
);
vlc_module_end
();
/*****************************************************************************
* vout_sys_t: video output descriptor
*****************************************************************************
* This structure is part of the video output thread descriptor.
* It describes the SVGAlib specific properties of an output thread.
*****************************************************************************/
struct
vout_sys_t
{
vlc_fourcc_t
i_codec
;
video_encoder_t
*
p_encoder
;
int
i_buffer
;
void
*
p_buffer
;
input_thread_t
*
p_input
;
es_descriptor_t
*
p_es
;
};
/*****************************************************************************
* Create: allocates video thread
*****************************************************************************
* This function allocates and initializes a vout method.
*****************************************************************************/
static
int
Create
(
vlc_object_t
*
p_this
)
{
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_this
;
char
*
psz_sout
;
char
*
psz_sout_vcodec
;
vlc_fourcc_t
i_codec
;
psz_sout
=
config_GetPsz
(
p_vout
,
"sout"
);
if
(
!
psz_sout
||
!*
psz_sout
)
{
/* avoid bad infinite loop */
msg_Err
(
p_vout
,
"encoder video output should be used only in sout mode"
);
if
(
psz_sout
)
free
(
psz_sout
);
return
VLC_EGENERIC
;
}
free
(
psz_sout
);
psz_sout_vcodec
=
config_GetPsz
(
p_vout
,
"sout-vcodec"
);
if
(
!
psz_sout_vcodec
||
!*
psz_sout_vcodec
)
{
msg_Err
(
p_vout
,
"you have to specify a video codec using sout-vcodec"
);
if
(
psz_sout_vcodec
)
free
(
psz_sout_vcodec
);
return
VLC_EGENERIC
;
}
if
(
!
strcmp
(
psz_sout_vcodec
,
"mpeg4"
)
)
{
i_codec
=
VLC_FOURCC
(
'm'
,
'p'
,
'4'
,
'v'
);
}
else
if
(
!
strcmp
(
psz_sout_vcodec
,
"mpeg2"
)
)
{
i_codec
=
VLC_FOURCC
(
'm'
,
'p'
,
'2'
,
'v'
);
}
else
if
(
!
strcmp
(
psz_sout_vcodec
,
"mpeg1"
)
)
{
i_codec
=
VLC_FOURCC
(
'm'
,
'p'
,
'1'
,
'v'
);
}
else
{
int
i
;
int
c
[
4
];
msg_Warn
(
p_vout
,
"unknown codec %s used as a fourcc"
,
psz_sout_vcodec
);
for
(
i
=
0
;
i
<
4
;
i
++
)
{
if
(
psz_sout_vcodec
[
i
]
)
c
[
i
]
=
psz_sout_vcodec
[
i
];
else
c
[
i
]
=
' '
;
}
i_codec
=
VLC_FOURCC
(
c
[
0
],
c
[
1
],
c
[
2
],
c
[
3
]
);
}
free
(
psz_sout_vcodec
);
/* Allocate instance and initialize some members */
if
(
!
(
p_vout
->
p_sys
=
malloc
(
sizeof
(
vout_sys_t
)
)
)
)
{
return
VLC_ENOMEM
;
}
memset
(
p_vout
->
p_sys
,
0
,
sizeof
(
vout_sys_t
)
);
/* *** save parameters *** */
p_vout
->
p_sys
->
i_codec
=
i_codec
;
/* *** set exported functions *** */
p_vout
->
pf_init
=
Init
;
p_vout
->
pf_end
=
End
;
p_vout
->
pf_render
=
Render
;
p_vout
->
pf_manage
=
Manage
;
p_vout
->
pf_display
=
Display
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
* Init: initialize video thread
*****************************************************************************/
static
int
Init
(
vout_thread_t
*
p_vout
)
{
vout_sys_t
*
p_sys
=
p_vout
->
p_sys
;
video_encoder_t
*
p_encoder
=
p_vout
->
p_sys
->
p_encoder
;
char
*
psz_sout_vcodec
;
int
i_index
;
picture_t
*
p_pic
;
/* *** create a video encoder object *** */
p_vout
->
p_sys
->
p_encoder
=
p_encoder
=
vlc_object_create
(
p_vout
,
sizeof
(
video_encoder_t
)
);
/* *** set wanted input format *** */
p_encoder
->
i_codec
=
p_vout
->
p_sys
->
i_codec
;
/* *** set preferred properties *** */
/* encoder can modify all these values except i_codec */
p_encoder
->
i_chroma
=
p_vout
->
render
.
i_chroma
;
p_encoder
->
i_width
=
p_vout
->
render
.
i_width
;
p_encoder
->
i_height
=
p_vout
->
render
.
i_height
;
p_encoder
->
i_aspect
=
p_vout
->
render
.
i_aspect
;
p_encoder
->
i_buffer_size
=
0
;
/* *** requuest this module *** */
p_encoder
->
p_module
=
module_Need
(
p_encoder
,
"video encoder"
,
"$video-encoder"
);
if
(
!
p_encoder
->
p_module
)
{
msg_Warn
(
p_vout
,
"no suitable encoder to %4.4s"
,
(
char
*
)
&
p_encoder
->
i_codec
);
vlc_object_destroy
(
p_encoder
);
return
VLC_EGENERIC
;
}
/* *** init the codec *** */
if
(
p_encoder
->
pf_init
(
p_encoder
)
)
{
msg_Err
(
p_vout
,
"failed to initialize video encoder plugin"
);
vlc_object_destroy
(
p_encoder
);
return
VLC_EGENERIC
;
}
/* *** alloacted buffer *** */
if
(
p_encoder
->
i_buffer_size
<=
0
)
{
p_encoder
->
i_buffer_size
=
10
*
p_encoder
->
i_width
*
p_encoder
->
i_height
;
}
p_sys
->
i_buffer
=
p_encoder
->
i_buffer_size
;
if
(
!
(
p_sys
->
p_buffer
=
malloc
(
p_encoder
->
i_buffer_size
)
)
)
{
msg_Err
(
p_vout
,
"out of memory"
);
return
VLC_ENOMEM
;
}
/* *** create a new standalone ES *** */
/* find a p_input */
p_sys
->
p_input
=
vlc_object_find
(
p_vout
,
VLC_OBJECT_INPUT
,
FIND_ANYWHERE
);
if
(
!
p_sys
->
p_input
)
{
msg_Err
(
p_vout
,
"cannot find p_input"
);
return
VLC_EGENERIC
;
}
vlc_mutex_lock
(
&
p_sys
->
p_input
->
stream
.
stream_lock
);
/* avoid bad loop (else output will also be reencoded until it segfault :p*/
/* XXX do it after the lock (if we have multiple video stream...) */
psz_sout_vcodec
=
config_GetPsz
(
p_vout
,
"sout-vcodec"
);
config_PutPsz
(
p_vout
,
"sout-vcodec"
,
NULL
);
/* add a new stream */
p_sys
->
p_es
=
input_AddES
(
p_sys
->
p_input
,
NULL
,
/* we aren't attached to a program */
12
,
/* es_id */
0
);
/* no extra data */
if
(
!
p_sys
->
p_es
)
{
msg_Err
(
p_vout
,
"cannot create es"
);
vlc_mutex_unlock
(
&
p_sys
->
p_input
->
stream
.
stream_lock
);
return
VLC_EGENERIC
;
}
p_sys
->
p_es
->
i_stream_id
=
1
;
p_sys
->
p_es
->
i_fourcc
=
p_encoder
->
i_codec
;
p_sys
->
p_es
->
i_cat
=
VIDEO_ES
;
if
(
input_SelectES
(
p_sys
->
p_input
,
p_sys
->
p_es
)
)
{
input_DelES
(
p_sys
->
p_input
,
p_sys
->
p_es
);
vlc_mutex_unlock
(
&
p_sys
->
p_input
->
stream
.
stream_lock
);
msg_Err
(
p_vout
,
"cannot select es"
);
return
VLC_EGENERIC
;
}
/* restore value as we could have multiple video stream (have you a 42*12 GHz ?) */
config_PutPsz
(
p_vout
,
"sout-vcodec"
,
psz_sout_vcodec
);
vlc_mutex_unlock
(
&
p_sys
->
p_input
->
stream
.
stream_lock
);
I_OUTPUTPICTURES
=
0
;
p_vout
->
output
.
pf_setpalette
=
SetPalette
;
/* remember that this value could have been modified by encoder */
p_vout
->
output
.
i_chroma
=
p_vout
->
p_sys
->
p_encoder
->
i_chroma
;
p_vout
->
output
.
i_width
=
p_vout
->
p_sys
->
p_encoder
->
i_width
;
p_vout
->
output
.
i_height
=
p_vout
->
p_sys
->
p_encoder
->
i_height
;
p_vout
->
output
.
i_aspect
=
p_vout
->
p_sys
->
p_encoder
->
i_aspect
;
/* Try to initialize 1 direct buffer */
p_pic
=
NULL
;
/* Find an empty picture slot */
for
(
i_index
=
0
;
i_index
<
VOUT_MAX_PICTURES
;
i_index
++
)
{
if
(
p_vout
->
p_picture
[
i_index
].
i_status
==
FREE_PICTURE
)
{
p_pic
=
p_vout
->
p_picture
+
i_index
;
break
;
}
}
/* Allocate the picture */
if
(
p_pic
==
NULL
)
{
return
VLC_SUCCESS
;
}
vout_AllocatePicture
(
p_vout
,
p_pic
,
p_vout
->
output
.
i_width
,
p_vout
->
output
.
i_height
,
p_vout
->
output
.
i_chroma
);
if
(
p_pic
->
i_planes
==
0
)
{
return
VLC_SUCCESS
;
}
p_pic
->
i_status
=
DESTROYED_PICTURE
;
p_pic
->
i_type
=
DIRECT_PICTURE
;
PP_OUTPUTPICTURE
[
I_OUTPUTPICTURES
]
=
p_pic
;
I_OUTPUTPICTURES
++
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
* End: terminate video thread
*****************************************************************************/
static
void
End
(
vout_thread_t
*
p_vout
)
{
vout_sys_t
*
p_sys
=
p_vout
->
p_sys
;
video_encoder_t
*
p_encoder
=
p_vout
->
p_sys
->
p_encoder
;
/* *** stop encoder *** */
p_encoder
->
pf_end
(
p_encoder
);
vlc_object_release
(
p_sys
->
p_input
);
/* *** unload encoder plugin *** */
module_Unneed
(
p_encoder
,
p_encoder
->
p_module
);
vlc_object_destroy
(
p_encoder
);
free
(
p_sys
->
p_buffer
);
}
/*****************************************************************************
* Destroy: destroy video thread
*****************************************************************************
* Terminate an output method created by Create
*****************************************************************************/
static
void
Destroy
(
vlc_object_t
*
p_this
)
{
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_this
;
/* Destroy structure */
free
(
p_vout
->
p_sys
);
p_vout
->
p_sys
=
NULL
;
}
/*****************************************************************************
* Manage: handle events
*****************************************************************************
* This function should be called regularly by video output thread. It manages
* console events. It returns a non null value on error.
*****************************************************************************/
static
int
Manage
(
vout_thread_t
*
p_vout
)
{
return
VLC_SUCCESS
;
}
/*****************************************************************************
* Render:
*****************************************************************************
*
*****************************************************************************/
static
void
Render
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
}
/*****************************************************************************
* Display: displays previously rendered output
*****************************************************************************
* This function sends the currently rendered image to the VGA card.
*****************************************************************************/
static
void
Display
(
vout_thread_t
*
p_vout
,
picture_t
*
p_pic
)
{
vout_sys_t
*
p_sys
=
p_vout
->
p_sys
;
video_encoder_t
*
p_encoder
=
p_vout
->
p_sys
->
p_encoder
;
int
i_err
;
size_t
i_data
;
i_data
=
p_sys
->
i_buffer
;
i_err
=
p_encoder
->
pf_encode
(
p_encoder
,
p_pic
,
p_sys
->
p_buffer
,
&
i_data
);
if
(
i_err
)
{
msg_Err
(
p_vout
,
"failed to encode a frame (err:0x%x)"
,
i_err
);
return
;
}
if
(
i_data
>
0
&&
p_sys
->
p_es
->
p_decoder_fifo
)
{
pes_packet_t
*
p_pes
;
data_packet_t
*
p_data
;
if
(
!
(
p_pes
=
input_NewPES
(
p_sys
->
p_input
->
p_method_data
)
)
)
{
msg_Err
(
p_vout
,
"cannot allocate new PES"
);
return
;
}
if
(
!
(
p_data
=
input_NewPacket
(
p_sys
->
p_input
->
p_method_data
,
i_data
)
)
)
{
msg_Err
(
p_vout
,
"cannot allocate new data_packet"
);
return
;
}
p_pes
->
i_dts
=
p_pic
->
date
;
p_pes
->
i_pts
=
p_pic
->
date
;
p_pes
->
p_first
=
p_pes
->
p_last
=
p_data
;
p_pes
->
i_nb_data
=
1
;
p_pes
->
i_pes_size
=
i_data
;
p_vout
->
p_vlc
->
pf_memcpy
(
p_data
->
p_payload_start
,
p_sys
->
p_buffer
,
i_data
);
input_DecodePES
(
p_sys
->
p_es
->
p_decoder_fifo
,
p_pes
);
}
}
/*****************************************************************************
* SetPalette: set a 8bpp palette
*****************************************************************************
* TODO: support 8 bits clut (for Mach32 cards and others).
*****************************************************************************/
static
void
SetPalette
(
vout_thread_t
*
p_vout
,
uint16_t
*
red
,
uint16_t
*
green
,
uint16_t
*
blue
)
{
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment