summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/import/aux_pes.c
diff options
context:
space:
mode:
Diffstat (limited to 'debian/transcode/transcode-1.1.7/import/aux_pes.c')
-rw-r--r--debian/transcode/transcode-1.1.7/import/aux_pes.c227
1 files changed, 227 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/import/aux_pes.c b/debian/transcode/transcode-1.1.7/import/aux_pes.c
new file mode 100644
index 00000000..43e93e60
--- /dev/null
+++ b/debian/transcode/transcode-1.1.7/import/aux_pes.c
@@ -0,0 +1,227 @@
+/*
+ * aux_pes.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.
+ *
+ */
+
+#include "transcode.h"
+#include "libtc/libtc.h"
+#include "ioaux.h"
+#include "aux_pes.h"
+
+
+static char * aspect_ratio_information_str[16] = {
+ "Invalid Aspect Ratio",
+ "1:1",
+ "4:3",
+ "16:9",
+ "2.21:1",
+ "Invalid Aspect Ratio",
+ "Invalid Aspect Ratio",
+ "Invalid Aspect Ratio",
+ "4:3",
+ "Invalid Aspect Ratio",
+ "Invalid Aspect Ratio",
+ "4:3",
+ "Invalid Aspect Ratio",
+ "Invalid Aspect Ratio",
+ "Invalid Aspect Ratio"
+};
+
+static char * frame_rate_str[16] = {
+ "Invalid frame_rate_code",
+ "23.976", "24", "25" , "29.97",
+ "30" , "50", "59.94", "60" ,
+ "1", "5", "10", "12", "15", //libmpeg3 only
+ "Invalid frame_rate_code",
+ "Invalid frame_rate_code"
+};
+
+
+int stats_sequence_silent(uint8_t * buffer, seq_info_t *seq_info)
+{
+
+ int horizontal_size;
+ int vertical_size;
+ int aspect_ratio_information;
+ int frame_rate_code;
+ int bit_rate_value;
+
+ vertical_size = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2];
+ horizontal_size = ((vertical_size >> 12) + 15) & ~15;
+ vertical_size = ((vertical_size & 0xfff) + 15) & ~15;
+
+ aspect_ratio_information = buffer[3] >> 4;
+ frame_rate_code = buffer[3] & 15;
+ bit_rate_value = (buffer[4] << 10) | (buffer[5] << 2) | (buffer[6] >> 6);
+ if(aspect_ratio_information < 0 || aspect_ratio_information>15) {
+ tc_log_error(__FILE__, "****** invalid MPEG sequence header detected (%d/%d|%d/%d) ******",
+ aspect_ratio_information, 16, frame_rate_code, 16);
+ return(-1);
+ }
+
+ if(frame_rate_code < 0 || frame_rate_code>15) {
+ tc_log_error(__FILE__, "****** invalid MPEG sequence header detected (%d/%d|%d/%d) ******",
+ frame_rate_code, 16, aspect_ratio_information, 8);
+ return(-1);
+ }
+
+ //fill out user structure
+
+ seq_info->w = horizontal_size;
+ seq_info->h = vertical_size;
+ seq_info->ari = aspect_ratio_information;
+ seq_info->frc = frame_rate_code;
+ seq_info->brv = bit_rate_value;
+
+ return(0);
+
+}
+int stats_sequence(uint8_t * buffer, seq_info_t *seq_info)
+{
+
+ int horizontal_size;
+ int vertical_size;
+ int aspect_ratio_information;
+ int frame_rate_code;
+ int bit_rate_value;
+ int vbv_buffer_size_value;
+ int constrained_parameters_flag;
+ int load_intra_quantizer_matrix;
+ int load_non_intra_quantizer_matrix;
+
+ vertical_size = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2];
+ horizontal_size = ((vertical_size >> 12) + 15) & ~15;
+ vertical_size = ((vertical_size & 0xfff) + 15) & ~15;
+
+ aspect_ratio_information = buffer[3] >> 4;
+ frame_rate_code = buffer[3] & 15;
+ bit_rate_value = (buffer[4] << 10) | (buffer[5] << 2) | (buffer[6] >> 6);
+ vbv_buffer_size_value = ((buffer[6] << 5) | (buffer[7] >> 3)) & 0x3ff;
+ constrained_parameters_flag = buffer[7] & 4;
+ load_intra_quantizer_matrix = buffer[7] & 2;
+ if (load_intra_quantizer_matrix)
+ buffer += 64;
+ load_non_intra_quantizer_matrix = buffer[7] & 1;
+
+ if(aspect_ratio_information < 0 || aspect_ratio_information>15) {
+ tc_log_error(__FILE__, "****** invalid MPEG sequence header detected (%d/%d|%d/%d) ******",
+ aspect_ratio_information, 16, frame_rate_code, 16);
+ return(-1);
+ }
+
+ if(frame_rate_code < 0 || frame_rate_code>15) {
+ tc_log_error(__FILE__, "****** invalid MPEG sequence header detected (%d/%d|%d/%d) ******",
+ frame_rate_code, 16, aspect_ratio_information, 8);
+ return(-1);
+ }
+
+ tc_log_msg(__FILE__,
+ "sequence: %dx%d %s, %s fps, %5.0f kbps, VBV %d kB%s%s%s",
+ horizontal_size, vertical_size,
+ aspect_ratio_information_str [aspect_ratio_information],
+ frame_rate_str [frame_rate_code],
+ bit_rate_value * 400.0 / 1000.0,
+ 2 * vbv_buffer_size_value,
+ constrained_parameters_flag ? " , CP":"",
+ load_intra_quantizer_matrix ? " , Custom Intra Matrix":"",
+ load_non_intra_quantizer_matrix ? " , Custom Non-Intra Matrix":"");
+
+
+ //fill out user structure
+
+ seq_info->w = horizontal_size;
+ seq_info->h = vertical_size;
+ seq_info->ari = aspect_ratio_information;
+ seq_info->frc = frame_rate_code;
+ seq_info->brv = bit_rate_value;
+
+ return(0);
+
+}
+
+int get_pts_dts(char *buffer, unsigned long *pts, unsigned long *dts)
+{
+ unsigned int pes_header_bytes = 0;
+ unsigned int pts_dts_flags;
+ int pes_header_data_length;
+
+ int has_pts_dts=0;
+
+ unsigned int ptr=0;
+
+ /* drop first 8 bits */
+ ++ptr;
+ pts_dts_flags = (buffer[ptr++] >> 6) & 0x3;
+ pes_header_data_length = buffer[ptr++];
+
+ switch(pts_dts_flags)
+
+ {
+
+ case 2:
+
+ *pts = (buffer[ptr++] >> 1) & 7; //low 4 bits (7==1111)
+ *pts <<= 15;
+ *pts |= (stream_read_int16(&buffer[ptr]) >> 1);
+ ptr+=2;
+ *pts <<= 15;
+ *pts |= (stream_read_int16(&buffer[ptr]) >> 1);
+ ptr+=2;
+
+ pes_header_bytes += 5;
+
+ has_pts_dts=1;
+
+ break;
+
+ case 3:
+
+ *pts = (buffer[ptr++] >> 1) & 7; //low 4 bits (7==1111)
+ *pts <<= 15;
+ *pts |= (stream_read_int16(&buffer[ptr]) >> 1);
+ ptr+=2;
+ *pts <<= 15;
+ *pts |= (stream_read_int16(&buffer[ptr]) >> 1);
+ ptr+=2;
+
+ *dts = (buffer[ptr++] >> 1) & 7;
+ *dts <<= 15;
+ *dts |= (stream_read_int16(&buffer[ptr]) >> 1);
+ ptr+=2;
+ *dts <<= 15;
+ *dts |= (stream_read_int16(&buffer[ptr]) >> 1);
+ ptr+=2;
+
+ pes_header_bytes += 10;
+
+ has_pts_dts=1;
+
+ break;
+
+ default:
+
+ has_pts_dts=0;
+ *dts=*pts=0;
+ break;
+ }
+
+ return(has_pts_dts);
+}