summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/import/import_ac3.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/import/import_ac3.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/import/import_ac3.c')
-rw-r--r--debian/transcode/transcode-1.1.7/import/import_ac3.c215
1 files changed, 215 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/import/import_ac3.c b/debian/transcode/transcode-1.1.7/import/import_ac3.c
new file mode 100644
index 00000000..344fcba7
--- /dev/null
+++ b/debian/transcode/transcode-1.1.7/import/import_ac3.c
@@ -0,0 +1,215 @@
+/*
+ * import_ac3.c
+ *
+ * Copyright (C) Thomas Oestreich - June 2001
+ *
+ * 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, 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 GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#define MOD_NAME "import_ac3.so"
+#define MOD_VERSION "v0.3.2 (2002-02-15)"
+#define MOD_CODEC "(audio) AC3"
+
+#include "transcode.h"
+
+static int verbose_flag = TC_QUIET;
+static int capability_flag = TC_CAP_PCM | TC_CAP_AC3;
+
+#define MOD_PRE ac3
+#include "import_def.h"
+
+#include "ac3scan.h"
+
+
+char import_cmd_buf[TC_BUF_MAX];
+
+static FILE *fd;
+
+static int codec, syncf=0;
+static int pseudo_frame_size=0, real_frame_size=0, effective_frame_size=0;
+static int ac3_bytes_to_go=0;
+
+
+/* ------------------------------------------------------------
+ *
+ * open stream
+ *
+ * ------------------------------------------------------------*/
+
+MOD_open
+{
+ long sret;
+
+ // audio only
+ if(param->flag != TC_AUDIO) return(TC_IMPORT_ERROR);
+
+ codec = vob->im_a_codec;
+ syncf = vob->sync;
+
+ switch(codec) {
+
+ case CODEC_AC3:
+
+ // produce a clean sequence of AC3 frames
+ sret = tc_snprintf(import_cmd_buf, TC_BUF_MAX,
+ "tcextract -a %d -i \"%s\" -x ac3 -d %d |"
+ " tcextract -t raw -x ac3 -d %d",
+ vob->a_track, vob->audio_in_file, vob->verbose, vob->verbose);
+ if (sret < 0)
+ return(TC_IMPORT_ERROR);
+
+ if(verbose_flag) tc_log_info(MOD_NAME, "AC3->AC3");
+
+ break;
+
+ case CODEC_PCM:
+
+ if(vob->a_codec_flag==CODEC_AC3) {
+
+ sret = tc_snprintf(import_cmd_buf, TC_BUF_MAX,
+ "tcextract -a %d -i \"%s\" -x ac3 -d %d |"
+ " tcdecode -x ac3 -d %d -s %f,%f,%f -A %d",
+ vob->a_track, vob->audio_in_file, vob->verbose,
+ vob->verbose, vob->ac3_gain[0], vob->ac3_gain[1],
+ vob->ac3_gain[2], vob->a52_mode);
+ if (sret < 0)
+ return(TC_IMPORT_ERROR);
+
+ if(verbose_flag) tc_log_info(MOD_NAME, "AC3->PCM");
+ }
+
+ break;
+
+ default:
+ tc_log_warn(MOD_NAME, "invalid import codec request 0x%x", codec);
+ return(TC_IMPORT_ERROR);
+
+ }
+
+ // print out
+ if(verbose_flag)
+ tc_log_info(MOD_NAME, "%s", import_cmd_buf);
+
+ // set to NULL if we handle read
+ param->fd = NULL;
+
+ // popen
+ if((fd = popen(import_cmd_buf, "r"))== NULL) {
+ tc_log_perror(MOD_NAME, "popen pcm stream");
+ return(TC_IMPORT_ERROR);
+ }
+
+ return(TC_IMPORT_OK);
+}
+
+/* ------------------------------------------------------------
+ *
+ * decode stream
+ *
+ * ------------------------------------------------------------*/
+
+MOD_decode
+{
+
+ int ac_bytes=0, ac_off=0;
+ int num_frames;
+
+ // audio only
+ if(param->flag != TC_AUDIO) return(TC_IMPORT_ERROR);
+
+ switch(codec) {
+
+ case CODEC_AC3:
+
+ // determine frame size at the very beginning of the stream
+
+ if (pseudo_frame_size == 0) {
+
+ if (ac3scan(fd, param->buffer, param->size, &ac_off, &ac_bytes,
+ &pseudo_frame_size, &real_frame_size, verbose) != 0)
+ return(TC_IMPORT_ERROR);
+
+ } else {
+ ac_off = 0;
+ ac_bytes = pseudo_frame_size;
+ }
+
+
+ // switch to entire frames:
+ // bytes_to_go is the difference between requested bytes and
+ // delivered bytes
+ //
+ // pseudo_frame_size = average bytes per audio frame
+ // real_frame_size = real AC3 frame size in bytes
+
+ num_frames = (ac_bytes + ac3_bytes_to_go) / real_frame_size;
+
+ effective_frame_size = num_frames * real_frame_size;
+ ac3_bytes_to_go = ac_bytes + ac3_bytes_to_go - effective_frame_size;
+
+ // return effective_frame_size as physical size of audio data
+ param->size = effective_frame_size;
+
+ if (verbose_flag & TC_STATS)
+ tc_log_info(MOD_NAME, "pseudo=%d, real=%d, frames=%d, effective=%d",
+ ac_bytes, real_frame_size, num_frames,
+ effective_frame_size);
+
+ // adjust
+ ac_bytes=effective_frame_size;
+
+ if(syncf>0) {
+ //dump an ac3 frame, instead of a pcm frame
+ ac_bytes = real_frame_size-ac_off;
+ param->size = real_frame_size;
+ --syncf;
+ }
+
+ break;
+
+ case CODEC_PCM:
+
+ //default:
+ ac_off = 0;
+ ac_bytes = param->size;
+ break;
+
+ default:
+ tc_log_warn(MOD_NAME, "invalid import codec request 0x%x", codec);
+ return(TC_IMPORT_ERROR);
+
+ }
+
+ if (fread(param->buffer+ac_off, ac_bytes-ac_off, 1, fd) !=1)
+ return(TC_IMPORT_ERROR);
+
+ return(TC_IMPORT_OK);
+}
+
+/* ------------------------------------------------------------
+ *
+ * close stream
+ *
+ * ------------------------------------------------------------*/
+
+MOD_close
+{
+ if(param->fd != NULL) pclose(param->fd);
+
+ return(TC_IMPORT_OK);
+}