[MPlayer-cvslog] r28245 - in trunk: DOCS/man/en/mplayer.1 cfg-common-opts.h cfg-common.h libmpdemux/demux_ts.c
nicodvb
subversion at mplayerhq.hu
Sun Jan 4 14:12:51 CET 2009
Author: nicodvb
Date: Sun Jan 4 14:12:51 2009
New Revision: 28245
Log:
added support for manual audio substream selection out of 0xFD PES streams (Blueray, multistream in the same pid)
Modified:
trunk/cfg-common-opts.h
trunk/cfg-common.h
trunk/libmpdemux/demux_ts.c
Changes in other areas also in this revision:
Modified:
trunk/DOCS/man/en/mplayer.1
Modified: trunk/cfg-common-opts.h
==============================================================================
--- trunk/cfg-common-opts.h Sun Jan 4 14:08:13 2009 (r28244)
+++ trunk/cfg-common-opts.h Sun Jan 4 14:12:51 2009 (r28245)
@@ -123,6 +123,7 @@
// select audio/video/subtitle stream
{"aid", &audio_id, CONF_TYPE_INT, CONF_RANGE, 0, 8190, NULL},
+ {"ausid", &audio_substream_id, CONF_TYPE_INT, 0, 0, 0, NULL},
{"vid", &video_id, CONF_TYPE_INT, CONF_RANGE, 0, 8190, NULL},
{"sid", &dvdsub_id, CONF_TYPE_INT, CONF_RANGE, 0, 8190, NULL},
{"novideo", &video_id, CONF_TYPE_FLAG, 0, -1, -2, NULL},
Modified: trunk/cfg-common.h
==============================================================================
--- trunk/cfg-common.h Sun Jan 4 14:08:13 2009 (r28244)
+++ trunk/cfg-common.h Sun Jan 4 14:12:51 2009 (r28245)
@@ -53,6 +53,7 @@ extern int demuxer_type, audio_demuxer_t
extern int ts_prog;
extern int ts_keep_broken;
extern off_t ts_probe;
+extern int audio_substream_id;
extern off_t ps_probe;
#include "stream/tv.h"
Modified: trunk/libmpdemux/demux_ts.c
==============================================================================
--- trunk/libmpdemux/demux_ts.c Sun Jan 4 14:08:13 2009 (r28244)
+++ trunk/libmpdemux/demux_ts.c Sun Jan 4 14:12:51 2009 (r28245)
@@ -59,6 +59,7 @@
int ts_prog;
int ts_keep_broken=0;
off_t ts_probe = 0;
+int audio_substream_id = -1;
extern char *dvdsub_lang, *audio_lang; //for -alang
typedef enum
@@ -1280,6 +1281,67 @@ static int mp4_parse_sl_packet(pmt_t *pm
return m;
}
+//this function parses the extension fields in the PES header and returns the substream_id, or -1 in case of errors
+static int parse_pes_extension_fields(unsigned char *p, int pkt_len)
+{
+ int skip;
+ unsigned char flags;
+
+ if(!(p[7] & 0x1)) //no extension_field
+ return -1;
+ skip = 9;
+ if(p[7] & 0x80)
+ {
+ skip += 5;
+ if(p[7] & 0x40)
+ skip += 5;
+ }
+ if(p[7] & 0x20) //escr_flag
+ skip += 6;
+ if(p[7] & 0x10) //es_rate_flag
+ skip += 3;
+ if(p[7] & 0x08)//dsm_trick_mode is unsupported, skip
+ {
+ skip = 0;//don't let's parse the extension fields
+ }
+ if(p[7] & 0x04) //additional_copy_info
+ skip += 1;
+ if(p[7] & 0x02) //pes_crc_flag
+ skip += 2;
+ if(skip >= pkt_len) //too few bytes
+ return -1;
+ flags = p[skip];
+ skip++;
+ if(flags & 0x80) //pes_private_data_flag
+ skip += 16;
+ if(skip >= pkt_len)
+ return -1;
+ if(flags & 0x40) //pack_header_field_flag
+ {
+ unsigned char l = p[skip];
+ skip += l;
+ }
+ if(flags & 0x20) //program_packet_sequence_counter
+ skip += 2;
+ if(flags & 0x10) //p_std
+ skip += 2;
+ if(skip >= pkt_len)
+ return -1;
+ if(flags & 0x01) //finally the long desired pes_extension2
+ {
+ unsigned char l = p[skip]; //ext2 flag+len
+ skip++;
+ if((l == 0x81) && (skip < pkt_len))
+ {
+ int ssid = p[skip];
+ mp_msg(MSGT_IDENTIFY, MSGL_V, "SUBSTREAM_ID=%d (0x%02X)\n", ssid, ssid);
+ return ssid;
+ }
+ }
+
+ return -1;
+}
+
static int pes_parse2(unsigned char *buf, uint16_t packet_len, ES_stream_t *es, int32_t type_from_pmt, pmt_t *pmt, int pid)
{
unsigned char *p;
@@ -1343,6 +1405,13 @@ static int pes_parse2(unsigned char *buf
mp_msg(MSGT_DEMUX, MSGL_DBG2, "demux_ts: illegal value for PES_header_data_length (0x%02x)\n", header_len);
return 0;
}
+
+ if(stream_id==0xfd)
+ {
+ int ssid = parse_pes_extension_fields(p, pkt_len);
+ if((audio_substream_id!=-1) && (ssid != audio_substream_id))
+ return 0;
+ }
p += header_len + 9;
packet_len -= header_len + 3;
More information about the MPlayer-cvslog
mailing list