diff options
author | Michele Calgaro <[email protected]> | 2020-09-11 14:38:47 +0900 |
---|---|---|
committer | Michele Calgaro <[email protected]> | 2020-09-11 14:38:47 +0900 |
commit | 884c8093d63402a1ad0b502244b791e3c6782be3 (patch) | |
tree | a600d4ab0d431a2bdfe4c15b70df43c14fbd8dd0 /debian/transcode/transcode-1.1.7/export/export_pvn.c | |
parent | 14e1aa2006796f147f3f4811fb908a6b01e79253 (diff) | |
download | extra-dependencies-884c8093d63402a1ad0b502244b791e3c6782be3.tar.gz extra-dependencies-884c8093d63402a1ad0b502244b791e3c6782be3.zip |
Added debian extra dependency packages.
Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'debian/transcode/transcode-1.1.7/export/export_pvn.c')
-rw-r--r-- | debian/transcode/transcode-1.1.7/export/export_pvn.c | 373 |
1 files changed, 373 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/export/export_pvn.c b/debian/transcode/transcode-1.1.7/export/export_pvn.c new file mode 100644 index 00000000..e7f6fed3 --- /dev/null +++ b/debian/transcode/transcode-1.1.7/export/export_pvn.c @@ -0,0 +1,373 @@ +/* + * export_pvn.c -- module for exporting PVN video streams + * (http://www.cse.yorku.ca/~jgryn/research/pvnspecs.html) + * Written by Andrew Church <[email protected]> + * + * This file is part of transcode, a video stream processing tool. + * transcode is free software, distributable under the terms of the GNU + * General Public License (version 2 or later). See the file COPYING + * for details. + */ + +#include "transcode.h" +#include "libtc/libtc.h" +#include "libtc/optstr.h" +#include "libtc/tcmodule-plugin.h" +#include "libtcvideo/tcvideo.h" + +#define MOD_NAME "export_pvn.so" +#define MOD_VERSION "v1.0 (2006-10-06)" +#define MOD_CAP "Writes PVN video files" +#define MOD_AUTHOR "Andrew Church" + +#define MOD_FEATURES \ + TC_MODULE_FEATURE_MULTIPLEX|TC_MODULE_FEATURE_VIDEO + +#define MOD_FLAGS \ + TC_MODULE_FLAG_RECONFIGURABLE + + + +/*************************************************************************/ + +/* Local data structure: */ + +typedef struct { + int width, height; // Frame width and height (to catch changes) + int fd; // Output file descriptor + int framecount; // Number of frames written + off_t framecount_pos; // File position of frame count (for rewriting) +} PrivateData; + +/*************************************************************************/ +/*************************************************************************/ + +/* Module interface routines and data. */ + +/*************************************************************************/ + +/** + * pvn_init: Initialize this instance of the module. See tcmodule-data.h + * for function details. + */ + +static int pvn_init(TCModuleInstance *self, uint32_t features) +{ + PrivateData *pd; + + TC_MODULE_SELF_CHECK(self, "init"); + TC_MODULE_INIT_CHECK(self, MOD_FEATURES, features); + + self->userdata = pd = tc_malloc(sizeof(PrivateData)); + if (!pd) { + tc_log_error(MOD_NAME, "init: out of memory!"); + return -1; + } + pd->fd = -1; + pd->framecount = 0; + pd->framecount_pos = 0; + + if (verbose) { + tc_log_info(MOD_NAME, "%s %s", MOD_VERSION, MOD_CAP); + } + return 0; +} + +/*************************************************************************/ + +/** + * pvn_configure: Configure this instance of the module. See + * tcmodule-data.h for function details. + */ + +static int pvn_configure(TCModuleInstance *self, + const char *options, vob_t *vob) +{ + if (!self) { + return -1; + } + return 0; +} + +/*************************************************************************/ + +/** + * pvn_inspect: Return the value of an option in this instance of the + * module. See tcmodule-data.h for function details. + */ + +static int pvn_inspect(TCModuleInstance *self, + const char *param, const char **value) +{ + static char buf[TC_BUF_MAX]; + + if (!self || !param) + return -1; + + if (optstr_lookup(param, "help")) { + tc_snprintf(buf, sizeof(buf), + "Overview:\n" + " Writes a PVN video stream (format PV6a, 8-bit data).\n" + " A grayscale file (PV5a) is written instead if the -K\n" + " switch is given to transcode.\n" + " The RGB colorspace must be used (-V rgb24).\n" + "No options available.\n"); + *value = buf; + } + return 0; +} + +/*************************************************************************/ + +/** + * pvn_stop: Reset this instance of the module. See tcmodule-data.h for + * function details. + */ + +static int pvn_stop(TCModuleInstance *self) +{ + PrivateData *pd; + + if (!self) { + return -1; + } + pd = self->userdata; + + if (pd->fd != -1) { + if (pd->framecount > 0 && pd->framecount_pos > 0) { + /* Write out final frame count, if we can */ + if (lseek(pd->fd, pd->framecount_pos, SEEK_SET) != (off_t)-1) { + char buf[11]; + int len = tc_snprintf(buf, sizeof(buf), "%10d",pd->framecount); + if (len > 0) + tc_pwrite(pd->fd, buf, len); + } + } + close(pd->fd); + pd->fd = -1; + } + + return 0; +} + +/*************************************************************************/ + +/** + * pvn_fini: Clean up after this instance of the module. See + * tcmodule-data.h for function details. + */ + +static int pvn_fini(TCModuleInstance *self) +{ + if (!self) { + return -1; + } + pvn_stop(self); + tc_free(self->userdata); + self->userdata = NULL; + return 0; +} + +/*************************************************************************/ + +/** + * pvn_multiplex: Multiplex a frame of data. See tcmodule-data.h for + * function details. + */ + +static int pvn_multiplex(TCModuleInstance *self, + vframe_list_t *vframe, aframe_list_t *aframe) +{ + PrivateData *pd; + + if (!self) { + tc_log_error(MOD_NAME, "multiplex: self == NULL!"); + return -1; + } + pd = self->userdata; + if (pd->fd == -1) { + tc_log_error(MOD_NAME, "multiplex: no file opened!"); + return -1; + } + + if (vframe->v_width != pd->width || vframe->v_height != pd->height) { + tc_log_error(MOD_NAME, "Video frame size changed in midstream!"); + return -1; + } + if (vframe->v_codec != CODEC_RGB) { + tc_log_error(MOD_NAME, "Invalid codec for video frame!"); + return -1; + } + if (vframe->video_len != pd->width * pd->height * 3 + && vframe->video_len != pd->width * pd->height // for grayscale + ) { + tc_log_error(MOD_NAME, "Invalid size for video frame!"); + return -1; + } + if (tc_pwrite(pd->fd, vframe->video_buf, vframe->video_len) + != vframe->video_len + ) { + tc_log_error(MOD_NAME, "Error writing frame %d to output file: %s", + pd->framecount, strerror(errno)); + return -1; + } + pd->framecount++; + return vframe->video_len; +} + +/*************************************************************************/ + +static const TCCodecID pvn_codecs_in[] = { TC_CODEC_RGB, TC_CODEC_ERROR }; +static const TCCodecID pvn_codecs_out[] = { TC_CODEC_ERROR }; +static const TCFormatID pvn_formats_in[] = { TC_FORMAT_ERROR }; +static const TCFormatID pvn_formats_out[] = { TC_FORMAT_PVN, TC_CODEC_ERROR }; + +static const TCModuleInfo pvn_info = { + .features = MOD_FEATURES, + .flags = MOD_FLAGS, + .name = MOD_NAME, + .version = MOD_VERSION, + .description = MOD_CAP, + .codecs_in = pvn_codecs_in, + .codecs_out = pvn_codecs_out, + .formats_in = pvn_formats_in, + .formats_out = pvn_formats_out +}; + +static const TCModuleClass pvn_class = { + .info = &pvn_info, + + .init = pvn_init, + .fini = pvn_fini, + .configure = pvn_configure, + .stop = pvn_stop, + .inspect = pvn_inspect, + + .multiplex = pvn_multiplex, +}; + +extern const TCModuleClass *tc_plugin_setup(void) +{ + return &pvn_class; +} + +/*************************************************************************/ +/*************************************************************************/ + +/* Old-fashioned module interface. */ + +static TCModuleInstance mod; + +static int verbose_flag; +static int capability_flag = TC_CAP_RGB; +#define MOD_PRE pvn +#define MOD_CODEC "(video) PVN" +#include "export_def.h" +MOD_init {return 0;} +MOD_stop {return 0;} + +/*************************************************************************/ + +MOD_open +{ + PrivateData *pd = NULL; + char buf[1000]; + int len; + + if (param->flag != TC_VIDEO) + return -1; + if (pvn_init(&mod, TC_MODULE_FEATURE_MULTIPLEX|TC_MODULE_FEATURE_VIDEO) < 0) + return -1; + pd = mod.userdata; + + pd->width = vob->ex_v_width; + pd->height = vob->ex_v_height; + /* FIXME: stdout should be handled in a more standard fashion */ + if (strcmp(vob->video_out_file, "-") == 0) { // allow /dev/stdout too? + pd->fd = 1; + } else { + pd->fd = open(vob->video_out_file, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (pd->fd < 0) { + tc_log_error(MOD_NAME, "Unable to open %s: %s", + vob->video_out_file, strerror(errno)); + goto fail; + } + } + len = tc_snprintf(buf, sizeof(buf), "PV%da\r\n%d %d\r\n", + tc_get_vob()->decolor ? 5 : 6, + pd->width, pd->height); + if (len < 0) + goto fail; + if (tc_pwrite(pd->fd, buf, len) != len) { + tc_log_error(MOD_NAME, "Unable to write header to %s: %s", + vob->video_out_file, strerror(errno)); + goto fail; + } + pd->framecount_pos = lseek(pd->fd, 0, SEEK_CUR); // failure okay + len = tc_snprintf(buf, sizeof(buf), "%10d\r\n8\r\n%lf\r\n", + 0, (double)vob->ex_fps); + if (len < 0) + goto fail; + if (tc_pwrite(pd->fd, buf, len) != len) { + tc_log_error(MOD_NAME, "Unable to write header to %s: %s", + vob->video_out_file, strerror(errno)); + goto fail; + } + + return 0; + + fail: + pvn_fini(&mod); + return -1; +} + +/*************************************************************************/ + +MOD_close +{ + if (param->flag != TC_VIDEO) + return -1; + pvn_fini(&mod); + return 0; +} + +/*************************************************************************/ + +MOD_encode +{ + vframe_list_t vframe; + + if (param->flag != TC_VIDEO) + return -1; + + vframe.v_width = tc_get_vob()->ex_v_width; + vframe.v_height = tc_get_vob()->ex_v_height; + vframe.v_codec = tc_get_vob()->ex_v_codec; + vframe.video_buf = param->buffer; + vframe.video_len = param->size; + if (!vframe.v_codec) + vframe.v_codec = CODEC_RGB; // assume it's correct + if (tc_get_vob()->decolor) { + // Assume the data is already decolored and just take every third byte + int i; + vframe.video_len /= 3; + for (i = 0; i < vframe.video_len; i++) + vframe.video_buf[i] = vframe.video_buf[i*3]; + } + if (pvn_multiplex(&mod, &vframe, NULL) < 0) + return -1; + + return 0; +} + +/*************************************************************************/ + +/* + * Local variables: + * c-file-style: "stroustrup" + * c-file-offsets: ((case-label . *) (statement-case-intro . *)) + * indent-tabs-mode: nil + * End: + * + * vim: expandtab shiftwidth=4: + */ |