summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/import/demux_pass.c
diff options
context:
space:
mode:
Diffstat (limited to 'debian/transcode/transcode-1.1.7/import/demux_pass.c')
-rw-r--r--debian/transcode/transcode-1.1.7/import/demux_pass.c287
1 files changed, 287 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/import/demux_pass.c b/debian/transcode/transcode-1.1.7/import/demux_pass.c
new file mode 100644
index 00000000..10c5b0f3
--- /dev/null
+++ b/debian/transcode/transcode-1.1.7/import/demux_pass.c
@@ -0,0 +1,287 @@
+/*
+ * demux_pass.c
+ *
+ * Copyright (C) Thomas Oestreich - May 2002
+ *
+ * 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.
+ *
+ */
+
+#include "transcode.h"
+#include "libtc/libtc.h"
+#include "tcinfo.h"
+
+#include "ioaux.h"
+#include "aux_pes.h"
+#include "seqinfo.h"
+#include "demuxer.h"
+#include "packets.h"
+
+
+int gop, gop_pts, gop_cnt;
+
+/* if you listen carefully, then you can hear the desesperate
+ * whisper of this code calling for a rewrite. Or for a redesign.
+ * Or both. -- FR
+ */
+
+/* ------------------------------------------------------------
+ *
+ * demuxer pass_through mode
+ *
+ * ------------------------------------------------------------*/
+
+void tcdemux_pass_through(info_t *ipipe, int *pass, int npass)
+{
+ int bytes, p, id = 0;
+ int j = 0; // skipped packets counter
+ char *buffer = NULL;
+ int payload_id = 0, select = PACKAGE_ALL;
+ int unit, unit_seek = 0, track = 0, is_track = 0;
+ int resync_seq1 = 0;
+ int resync_seq2 = INT_MAX;
+ int seq_dump = 0;
+ int seq_seek = 0;
+ int keep_seq = 0;
+ int has_pts_dts = 0;
+ int flag_flush = 0;
+ // will be switched on as soon start of sequences to flush is reached
+ int flag_eos = 0;
+ int flag_notify = 1;
+ int flag_skip = 0;
+ int flag_sync_reset = 0;
+ int flag_sync_active = 0;
+ const char *logfile;
+ unsigned int pkt_size = VOB_PACKET_SIZE;
+ double fps;
+
+ // allocate space
+ buffer = tc_zalloc(pkt_size);
+ if (!buffer) {
+ tc_log_perror(__FILE__, "out of memory");
+ exit(1);
+ }
+
+ // copy info parameter to local variables
+ verbose = ipipe->verbose;
+ unit_seek = ipipe->ps_unit;
+ resync_seq1 = ipipe->ps_seq1;
+ resync_seq2 = ipipe->ps_seq2;
+ track = ipipe->track;
+ select = ipipe->select;
+ fps = ipipe->fps;
+ logfile = ipipe->name;
+ keep_seq = ipipe->keep_seq;
+
+ if (keep_seq)
+ flag_sync_active=1;
+
+ unit = unit_seek;
+
+ seq_seek = resync_seq1;
+ seq_dump = resync_seq2 - resync_seq1;
+
+ ++unit_seek;
+ ++seq_seek;
+
+ for (p = 0; p < npass; p++)
+ tc_log_msg(__FILE__, "pass[%i]=0x%x", p, pass[p]);
+
+ for (;;) {
+ /* ------------------------------------------------------------
+ *
+ * (I) read a 2048k block
+ *
+ * ------------------------------------------------------------*/
+
+ bytes = tc_pread(ipipe->fd_in, buffer, pkt_size);
+ if (bytes != pkt_size) {
+ // program end code?
+ if (bytes == 4) {
+ if (scan_pack_header(buffer, MPEG_PROGRAM_END_CODE)) {
+ if (verbose & TC_DEBUG)
+ tc_log_msg(__FILE__,
+ "(pid=%i) program stream end code found",
+ getpid());
+ break;
+ }
+ }
+
+ if (bytes)
+ tc_log_warn(__FILE__,
+ "invalid program stream packet size (%i/%i)",
+ bytes, pkt_size);
+ break;
+ }
+
+ /* ------------------------------------------------------------
+ *
+ * (II) packet header ok?
+ *
+ * ------------------------------------------------------------*/
+
+ if (!scan_pack_header(buffer, TC_MAGIC_VOB)) {
+ if (flag_notify && (verbose & TC_DEBUG))
+ tc_log_warn(__FILE__,
+ "(pid=%i) invalid packet header detected",
+ getpid());
+
+ // something else?
+ if (scan_pack_header(buffer, MPEG_VIDEO)
+ | scan_pack_header(buffer, MPEG_AUDIO)) {
+ /* CAUTION: bitwise OR */
+
+ if (verbose & TC_STATS)
+ tc_log_msg(__FILE__,
+ "(pid=%i) MPEG system stream detected",
+ getpid());
+
+ if (scan_pack_header(buffer, MPEG_VIDEO))
+ payload_id = PACKAGE_VIDEO;
+ if (scan_pack_header(buffer, MPEG_AUDIO))
+ payload_id = PACKAGE_AUDIO_MP3;
+
+ // no further processing
+ goto flush_packet; /* UGHly */
+ } else {
+ tc_log_warn(__FILE__,
+ "(pid=%i) '0x%02x%02x%02x%02x' not yet supported",
+ getpid(), buffer[0] & 0xff, buffer[1] & 0xff,
+ buffer[2] & 0xff, buffer[3] & 0xff);
+ break;
+ }
+ } else {
+ //MPEG1?
+ if ((buffer[4] & 0xf0) == 0x20) {
+ payload_id = PACKAGE_MPEG1;
+ flag_flush = 1;
+
+ if (verbose & TC_STATS)
+ tc_log_msg(__FILE__,
+ "(pid=%i) MPEG-1 video stream detected",
+ getpid());
+
+ // no further processing
+ goto flush_packet;
+ }
+ }
+
+
+ /* ------------------------------------------------------------
+ *
+ * (III) analyze packet contents
+ *
+ * ------------------------------------------------------------*/
+
+ // proceed with a valid package, assume defaults
+ flag_skip = 0; // do not skip
+ has_pts_dts = 0; // no pts_dts stamp
+ payload_id = 0; // payload unknown
+ flag_sync_reset = 0; // no reset of syncinfo
+
+ id = buffer[17] & 0xff; //payload id byte
+ //MPEG 2?
+ if ((buffer[4] & 0xc0) == 0x40) {
+ // do not change any flags
+ if (verbose & TC_STATS) {
+ //display info only once
+ tc_log_msg(__FILE__,
+ "(pid=%i) MPEG-2 video stream detected",
+ getpid());
+ }
+ } else {
+ // MPEG1
+ if ((buffer[4] & 0xf0) == 0x20) {
+ payload_id = PACKAGE_MPEG1;
+
+ if (verbose & TC_STATS) {
+ // display info only once
+ tc_log_msg(__FILE__,
+ "(pid=%i) MPEG-1 video stream detected",
+ getpid());
+ }
+ } else {
+ payload_id = PACKAGE_PASS;
+
+ if (verbose & TC_DEBUG)
+ tc_log_warn(__FILE__,
+ "(pid=%i) unknown stream packet id detected",
+ getpid());
+ }
+
+ //flush all MPEG1 stuff
+ goto flush_packet;
+ }
+
+ /* ------------------------------------------------------------
+ *
+ * (IV) audio payload
+ *
+ * ------------------------------------------------------------*/
+
+ // check payload id
+ // process this audio packet?
+
+ // sync to AC3 audio mode?
+ if (id == P_ID_AC3)
+ payload_id = PACKAGE_PRIVATE_STREAM;
+
+ // check for subid here:
+
+ is_track = id;
+
+ if (payload_id == PACKAGE_PRIVATE_STREAM) {
+ //position of track code
+ uint8_t *_buf=buffer + 14;
+ uint8_t *_tmp=_buf + 9 + _buf[8];
+
+ is_track = (*_tmp);
+ }
+
+ /* ------------------------------------------------------------
+ *
+ * (VII) evaluate scan results - flush packet
+ *
+ * ------------------------------------------------------------*/
+
+flush_packet:
+ for (p = 0; p < npass; p++) {
+ if (is_track == pass[p]) {
+ if (tc_pwrite(ipipe->fd_out, buffer, pkt_size) != pkt_size) {
+ tc_log_perror(__FILE__, "write program stream packet");
+ exit(1);
+ }
+ break;
+ }
+ }
+
+ // aborting?
+ if (flag_eos)
+ break;
+
+ //total packs (2k each) counter
+ ++j;
+
+ } // process next packet/block
+
+ if (buffer != NULL)
+ tc_free(buffer);
+
+ return;
+}
+
+