summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/multiplex/multiplex_avi.c
diff options
context:
space:
mode:
authorMichele Calgaro <michele.calgaro@yahoo.it>2020-09-11 14:38:47 +0900
committerMichele Calgaro <michele.calgaro@yahoo.it>2020-09-11 14:38:47 +0900
commit884c8093d63402a1ad0b502244b791e3c6782be3 (patch)
treea600d4ab0d431a2bdfe4c15b70df43c14fbd8dd0 /debian/transcode/transcode-1.1.7/multiplex/multiplex_avi.c
parent14e1aa2006796f147f3f4811fb908a6b01e79253 (diff)
downloadextra-dependencies-884c8093d63402a1ad0b502244b791e3c6782be3.tar.gz
extra-dependencies-884c8093d63402a1ad0b502244b791e3c6782be3.zip
Added debian extra dependency packages.
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
Diffstat (limited to 'debian/transcode/transcode-1.1.7/multiplex/multiplex_avi.c')
-rw-r--r--debian/transcode/transcode-1.1.7/multiplex/multiplex_avi.c257
1 files changed, 257 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/multiplex/multiplex_avi.c b/debian/transcode/transcode-1.1.7/multiplex/multiplex_avi.c
new file mode 100644
index 00000000..6091a8a5
--- /dev/null
+++ b/debian/transcode/transcode-1.1.7/multiplex/multiplex_avi.c
@@ -0,0 +1,257 @@
+/*
+ * multiplex_avi.c -- multiplex frames in an AVI file using avilib.
+ * (C) 2005-2010 Francesco Romani <fromani at gmail dot com>
+ *
+ * This file is part of transcode, a video stream processing tool.
+ *
+ * transcode 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.
+ *
+ * transcode 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, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "transcode.h"
+#include "libtc/optstr.h"
+
+#include "libtc/tcmodule-plugin.h"
+
+#include "avilib/avilib.h"
+
+#define MOD_NAME "multiplex_avi.so"
+#define MOD_VERSION "v0.0.2 (2005-12-29)"
+#define MOD_CAP "create an AVI stream using avilib"
+
+#define MOD_FEATURES \
+ TC_MODULE_FEATURE_MULTIPLEX|TC_MODULE_FEATURE_VIDEO|TC_MODULE_FEATURE_AUDIO
+
+#define MOD_FLAGS \
+ TC_MODULE_FLAG_RECONFIGURABLE
+
+
+/* default FourCC to use if given one isn't known or if it's just absent */
+#define DEFAULT_FOURCC "RGB"
+
+static const char avi_help[] = ""
+ "Overview:\n"
+ " this module create an AVI stream using avilib.\n"
+ " AVI streams produced by this module can have a\n"
+ " maximum of one audio and video track.\n"
+ " You can add more tracks with further processing.\n"
+ "Options:\n"
+ " help produce module overview and options explanations\n";
+
+typedef struct {
+ avi_t *avifile;
+ int force_kf; /* boolean flag */
+} AVIPrivateData;
+
+static int avi_inspect(TCModuleInstance *self,
+ const char *param, const char **value)
+{
+ TC_MODULE_SELF_CHECK(self, "inspect");
+
+ if (optstr_lookup(param, "help")) {
+ *value = avi_help;
+ }
+
+ return TC_OK;
+}
+
+static int avi_configure(TCModuleInstance *self,
+ const char *options, vob_t *vob)
+{
+ const char *fcc = NULL;
+ AVIPrivateData *pd = NULL;
+ int arate = (vob->mp3frequency != 0)
+ ?vob->mp3frequency :vob->a_rate;
+ int abitrate = (vob->ex_a_codec == CODEC_PCM)
+ ?(vob->a_rate*4)/1000*8 :vob->mp3bitrate;
+
+ TC_MODULE_SELF_CHECK(self, "configure");
+ TC_MODULE_SELF_CHECK(vob, "configure"); /* hackish? */
+
+ pd = self->userdata;
+
+ fcc = tc_codec_fourcc(vob->ex_v_codec);
+ if (fcc == NULL) {
+ fcc = DEFAULT_FOURCC;
+ }
+ if (verbose >= TC_DEBUG) {
+ tc_log_info(MOD_NAME, "AVI FourCC: '%s'", fcc);
+ }
+
+ if (vob->ex_v_codec == CODEC_RGB || vob->ex_v_codec == TC_CODEC_RGB
+ || vob->ex_v_codec == CODEC_YUV || vob->ex_v_codec == TC_CODEC_YUV420P
+ || vob->ex_v_codec == CODEC_YUV422 || vob->ex_v_codec == TC_CODEC_YUV422P) {
+ pd->force_kf = TC_TRUE;
+ } else {
+ pd->force_kf = TC_FALSE;
+ }
+
+ pd->avifile = AVI_open_output_file(vob->video_out_file);
+ if(!pd->avifile) {
+ tc_log_error(MOD_NAME, "avilib error: %s", AVI_strerror());
+ return TC_ERROR;
+ }
+
+ AVI_set_video(pd->avifile, vob->ex_v_width, vob->ex_v_height,
+ vob->ex_fps, fcc);
+
+ AVI_set_audio_track(pd->avifile, vob->a_track);
+ AVI_set_audio(pd->avifile, vob->dm_chan, arate, vob->dm_bits,
+ vob->ex_a_codec, abitrate);
+ AVI_set_audio_vbr(pd->avifile, vob->a_vbr);
+
+ return TC_OK;
+}
+
+static int avi_stop(TCModuleInstance *self)
+{
+ AVIPrivateData *pd = NULL;
+
+ TC_MODULE_SELF_CHECK(self, "stop");
+
+ pd = self->userdata;
+
+ if (pd->avifile != NULL) {
+ AVI_close(pd->avifile);
+ pd->avifile = NULL;
+ }
+
+ return TC_OK;
+}
+
+static int avi_multiplex(TCModuleInstance *self,
+ vframe_list_t *vframe, aframe_list_t *aframe)
+{
+ uint32_t size_before, size_after;
+ int ret;
+
+ AVIPrivateData *pd = NULL;
+
+ TC_MODULE_SELF_CHECK(self, "multiplex");
+
+ pd = self->userdata;
+ size_before = AVI_bytes_written(pd->avifile);
+
+ if (vframe != NULL && vframe->video_len > 0) {
+ int key = ((vframe->attributes & TC_FRAME_IS_KEYFRAME)
+ || pd->force_kf) ?1 :0;
+
+ ret = AVI_write_frame(pd->avifile, (const char*)vframe->video_buf,
+ vframe->video_len, key);
+
+ if(ret < 0) {
+ tc_log_error(MOD_NAME, "avilib error writing video: %s",
+ AVI_strerror());
+ return TC_ERROR;
+ }
+ }
+
+ if (aframe != NULL && aframe->audio_len > 0) {
+ ret = AVI_write_audio(pd->avifile, (const char*)aframe->audio_buf,
+ aframe->audio_len);
+ if (ret < 0) {
+ tc_log_error(MOD_NAME, "avilib error writing audio: %s",
+ AVI_strerror());
+ return TC_ERROR;
+ }
+ }
+
+ size_after = AVI_bytes_written(pd->avifile);
+
+ return (size_after - size_before);
+}
+
+static int avi_init(TCModuleInstance *self, uint32_t features)
+{
+ AVIPrivateData *pd = NULL;
+
+ TC_MODULE_SELF_CHECK(self, "init");
+ TC_MODULE_INIT_CHECK(self, MOD_FEATURES, features);
+
+ pd = tc_malloc(sizeof(AVIPrivateData));
+ if (!pd) {
+ return TC_ERROR;
+ }
+
+ pd->avifile = NULL;
+ pd->force_kf = TC_FALSE;
+
+ if (verbose) {
+ tc_log_info(MOD_NAME, "%s %s", MOD_VERSION, MOD_CAP);
+ if (verbose >= TC_DEBUG) {
+ tc_log_info(MOD_NAME, "max AVI-file size limit = %lu bytes",
+ (unsigned long)AVI_max_size());
+ }
+ }
+
+ self->userdata = pd;
+ return TC_OK;
+}
+
+static int avi_fini(TCModuleInstance *self)
+{
+ TC_MODULE_SELF_CHECK(self, "fini");
+
+ avi_stop(self);
+
+ tc_free(self->userdata);
+ self->userdata = NULL;
+
+ return TC_OK;
+}
+
+/*************************************************************************/
+
+static const TCCodecID avi_codecs_in[] = {
+ TC_CODEC_PCM, TC_CODEC_AC3, TC_CODEC_MP2, TC_CODEC_MP3,
+ TC_CODEC_AAC, /* FIXME: that means asking for troubles */
+ TC_CODEC_YUV420P, TC_CODEC_DV,
+ TC_CODEC_DIVX3, TC_CODEC_DIVX4, TC_CODEC_DIVX5, TC_CODEC_XVID,
+ TC_CODEC_H264, /* FIXME: that means asking for troubles */
+ TC_CODEC_MPEG4VIDEO, TC_CODEC_MPEG1VIDEO, TC_CODEC_MJPEG,
+ TC_CODEC_LZO1, TC_CODEC_LZO2, TC_CODEC_RGB,
+ TC_CODEC_ERROR
+};
+static const TCFormatID avi_formats_out[] = { TC_FORMAT_AVI, TC_FORMAT_ERROR };
+/* a multiplexor is at the end of pipeline */
+TC_MODULE_MPLEX_FORMATS_CODECS(avi);
+
+TC_MODULE_INFO(avi);
+
+static const TCModuleClass avi_class = {
+ TC_MODULE_CLASS_HEAD(avi),
+
+ .init = avi_init,
+ .fini = avi_fini,
+ .configure = avi_configure,
+ .stop = avi_stop,
+ .inspect = avi_inspect,
+
+ .multiplex = avi_multiplex,
+};
+
+TC_MODULE_ENTRY_POINT(avi)
+
+/*************************************************************************/
+
+/*
+ * Local variables:
+ * c-file-style: "stroustrup"
+ * c-file-offsets: ((case-label . *) (statement-case-intro . *))
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+ */
+