1
0
mirror of https://github.com/mpv-player/mpv synced 2025-04-17 20:58:20 +00:00

merged DEMUXER_TYPE_MPEG4_ES in the ordinary TS; added support for H264 in TS

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@14035 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
nicodvb 2004-11-24 18:55:03 +00:00
parent 8f722ca9d8
commit 939cfe1341
4 changed files with 56 additions and 42 deletions

View File

@ -61,6 +61,7 @@ typedef enum
VIDEO_MPEG1 = 0x10000001, VIDEO_MPEG1 = 0x10000001,
VIDEO_MPEG2 = 0x10000002, VIDEO_MPEG2 = 0x10000002,
VIDEO_MPEG4 = 0x10000004, VIDEO_MPEG4 = 0x10000004,
VIDEO_H264 = 0x10000005,
AUDIO_MP2 = 0x50, AUDIO_MP2 = 0x50,
AUDIO_A52 = 0x2000, AUDIO_A52 = 0x2000,
AUDIO_LPCM_BE = 0x10001, AUDIO_LPCM_BE = 0x10001,
@ -500,7 +501,7 @@ static off_t ts_detect_streams(demuxer_t *demuxer, tsdemux_init_t *param)
} }
is_audio = ((es.type == AUDIO_MP2) || (es.type == AUDIO_A52) || (es.type == AUDIO_LPCM_BE) || (es.type == AUDIO_AAC)); is_audio = ((es.type == AUDIO_MP2) || (es.type == AUDIO_A52) || (es.type == AUDIO_LPCM_BE) || (es.type == AUDIO_AAC));
is_video = ((es.type == VIDEO_MPEG1) || (es.type == VIDEO_MPEG2) || (es.type == VIDEO_MPEG4)); is_video = ((es.type == VIDEO_MPEG1) || (es.type == VIDEO_MPEG2) || (es.type == VIDEO_MPEG4) || (es.type == VIDEO_H264));
is_sub = ((es.type == SPU_DVD) || (es.type == SPU_DVB)); is_sub = ((es.type == SPU_DVD) || (es.type == SPU_DVB));
@ -650,7 +651,7 @@ static off_t ts_detect_streams(demuxer_t *demuxer, tsdemux_init_t *param)
} }
if(video_found) if(video_found)
mp_msg(MSGT_DEMUXER, MSGL_INFO, "VIDEO MPEG%d(pid=%d)...", (param->vtype == VIDEO_MPEG1 ? 1 : (param->vtype == VIDEO_MPEG2 ? 2 : 4)), param->vpid); mp_msg(MSGT_DEMUXER, MSGL_INFO, "VIDEO %s(pid=%d)...", (param->vtype == VIDEO_MPEG1 ? "MPEG1" : (param->vtype == VIDEO_MPEG2 ? "MPEG2" : (param->vtype == VIDEO_MPEG4 ? "MPEG4" : "H264"))), param->vpid);
else else
{ {
video_found = 0; video_found = 0;
@ -790,9 +791,6 @@ demuxer_t *demux_open_ts(demuxer_t * demuxer)
if(params.vtype != UNKNOWN) if(params.vtype != UNKNOWN)
{ {
if(params.vtype == VIDEO_MPEG4)
demuxer->file_format= DEMUXER_TYPE_MPEG4_IN_TS;
sh_video = new_sh_video(demuxer, 0); sh_video = new_sh_video(demuxer, 0);
sh_video->ds = demuxer->video; sh_video->ds = demuxer->video;
sh_video->format = params.vtype; sh_video->format = params.vtype;
@ -1573,6 +1571,9 @@ static int parse_pmt(ts_priv_t * priv, uint16_t progid, uint16_t pid, int is_sta
break; break;
*/ */
case 0x1b:
pmt->es[idx].type = VIDEO_H264;
break;
case 0x81: case 0x81:
pmt->es[idx].type = AUDIO_A52; pmt->es[idx].type = AUDIO_A52;
break; break;
@ -1845,7 +1846,7 @@ static int ts_parse(demuxer_t *demuxer , ES_stream_t *es, unsigned char *packet,
priv->last_pid = pid; priv->last_pid = pid;
is_video = ((tss->type == VIDEO_MPEG1) || (tss->type == VIDEO_MPEG2) || (tss->type == VIDEO_MPEG4)); is_video = ((tss->type == VIDEO_MPEG1) || (tss->type == VIDEO_MPEG2) || (tss->type == VIDEO_MPEG4) || (tss->type == VIDEO_H264));
is_audio = ((tss->type == AUDIO_MP2) || (tss->type == AUDIO_A52) || (tss->type == AUDIO_LPCM_BE) || (tss->type == AUDIO_AAC) is_audio = ((tss->type == AUDIO_MP2) || (tss->type == AUDIO_A52) || (tss->type == AUDIO_LPCM_BE) || (tss->type == AUDIO_AAC)
|| (tss->type == PES_PRIVATE1)); || (tss->type == PES_PRIVATE1));
is_sub = ((tss->type == SPU_DVD) || (tss->type == SPU_DVB)); is_sub = ((tss->type == SPU_DVD) || (tss->type == SPU_DVB));
@ -2263,10 +2264,14 @@ void demux_seek_ts(demuxer_t *demuxer, float rel_seek_secs, int flags)
{ {
if(i==0x1B3 || i==0x1B8) break; // found it! if(i==0x1B3 || i==0x1B8) break; // found it!
} }
else //MPEG4 else if(sh_video->format == VIDEO_MPEG4)
{ {
if(i==0x1B6) break; // found it! if(i==0x1B6) break; // found it!
} }
else //H264
{
if((i & ~0x60) == 0x101 || (i & ~0x60) == 0x102 || (i & ~0x60) == 0x105) break;
}
if(!i || !skip_video_packet(d_video)) break; // EOF? if(!i || !skip_video_packet(d_video)) break; // EOF?
} }

View File

@ -231,7 +231,6 @@ void free_demuxer(demuxer_t *demuxer){
case DEMUXER_TYPE_LMLM4: case DEMUXER_TYPE_LMLM4:
demux_close_lmlm4(demuxer); break; demux_close_lmlm4(demuxer); break;
case DEMUXER_TYPE_MPEG_TS: case DEMUXER_TYPE_MPEG_TS:
case DEMUXER_TYPE_MPEG4_IN_TS:
demux_close_ts(demuxer); break; demux_close_ts(demuxer); break;
case DEMUXER_TYPE_MPEG_PS: case DEMUXER_TYPE_MPEG_PS:
demux_close_mpg(demuxer); break; demux_close_mpg(demuxer); break;
@ -386,7 +385,6 @@ int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){
#endif #endif
case DEMUXER_TYPE_LMLM4: return demux_lmlm4_fill_buffer(demux); case DEMUXER_TYPE_LMLM4: return demux_lmlm4_fill_buffer(demux);
case DEMUXER_TYPE_MPEG_TS: case DEMUXER_TYPE_MPEG_TS:
case DEMUXER_TYPE_MPEG4_IN_TS:
return demux_ts_fill_buffer(demux); return demux_ts_fill_buffer(demux);
case DEMUXER_TYPE_REALAUDIO: return demux_ra_fill_buffer(demux); case DEMUXER_TYPE_REALAUDIO: return demux_ra_fill_buffer(demux);
#ifdef USE_LIBAVFORMAT #ifdef USE_LIBAVFORMAT
@ -1363,8 +1361,7 @@ switch(file_format){
break; break;
} }
#endif #endif
case DEMUXER_TYPE_MPEG_TS: case DEMUXER_TYPE_MPEG_TS: {
case DEMUXER_TYPE_MPEG4_IN_TS: {
demux_open_ts(demuxer); demux_open_ts(demuxer);
break; break;
} }
@ -1586,7 +1583,6 @@ switch(demuxer->file_format){
demux_mkv_seek(demuxer,rel_seek_secs,flags); break; demux_mkv_seek(demuxer,rel_seek_secs,flags); break;
#endif #endif
case DEMUXER_TYPE_MPEG_TS: case DEMUXER_TYPE_MPEG_TS:
case DEMUXER_TYPE_MPEG4_IN_TS:
demux_seek_ts(demuxer,rel_seek_secs,flags); break; demux_seek_ts(demuxer,rel_seek_secs,flags); break;
#ifdef USE_LIBAVFORMAT #ifdef USE_LIBAVFORMAT
case DEMUXER_TYPE_LAVF: case DEMUXER_TYPE_LAVF:
@ -1667,7 +1663,6 @@ int demux_control(demuxer_t *demuxer, int cmd, void *arg) {
case DEMUXER_TYPE_MPEG_ES: case DEMUXER_TYPE_MPEG_ES:
case DEMUXER_TYPE_MPEG_PS: case DEMUXER_TYPE_MPEG_PS:
case DEMUXER_TYPE_MPEG_TS: case DEMUXER_TYPE_MPEG_TS:
case DEMUXER_TYPE_MPEG4_IN_TS:
return demux_mpg_control(demuxer,cmd,arg); return demux_mpg_control(demuxer,cmd,arg);
case DEMUXER_TYPE_ASF: case DEMUXER_TYPE_ASF:
return demux_asf_control(demuxer,cmd,arg); return demux_asf_control(demuxer,cmd,arg);

View File

@ -55,10 +55,6 @@
// A virtual demuxer type for the network code // A virtual demuxer type for the network code
#define DEMUXER_TYPE_PLAYLIST (2<<16) #define DEMUXER_TYPE_PLAYLIST (2<<16)
//This one is needed only to identify mpeg4 in mpeg2-ts, shouldn't be used explicitly,
// rather use ths usual _TYPE_TS
#define DEMUXER_TYPE_MPEG4_IN_TS (3<<16)
#define DEMUXER_TIME_NONE 0 #define DEMUXER_TIME_NONE 0
#define DEMUXER_TIME_PTS 1 #define DEMUXER_TIME_PTS 1

View File

@ -37,10 +37,38 @@ static float telecine_cnt=-2.5;
int video_read_properties(sh_video_t *sh_video){ int video_read_properties(sh_video_t *sh_video){
demux_stream_t *d_video=sh_video->ds; demux_stream_t *d_video=sh_video->ds;
enum {
VIDEO_MPEG12,
VIDEO_MPEG4,
VIDEO_H264,
VIDEO_OTHER
} video_codec;
if((d_video->demuxer->file_format == DEMUXER_TYPE_PVA) ||
(d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_ES) ||
(d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_PS) ||
(d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_TY) ||
(d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_TS && ((sh_video->format==0x10000001) || (sh_video->format==0x10000002)))
#ifdef STREAMING_LIVE_DOT_COM
|| ((d_video->demuxer->file_format == DEMUXER_TYPE_RTP) && demux_is_mpeg_rtp_stream(d_video->demuxer))
#endif
)
video_codec = VIDEO_MPEG12;
else if((d_video->demuxer->file_format == DEMUXER_TYPE_MPEG4_ES) ||
((d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_TS) && (sh_video->format==0x10000004))
)
video_codec = VIDEO_MPEG4;
else if((d_video->demuxer->file_format == DEMUXER_TYPE_H264_ES) ||
((d_video->demuxer->file_format == DEMUXER_TYPE_MPEG_TS) && (sh_video->format==0x10000005))
)
video_codec = VIDEO_H264;
else
video_codec = VIDEO_OTHER;
// Determine image properties: // Determine image properties:
switch(d_video->demuxer->file_format){ switch(video_codec){
case DEMUXER_TYPE_AVI: case VIDEO_OTHER: {
case DEMUXER_TYPE_ASF: { if((d_video->demuxer->file_format == DEMUXER_TYPE_ASF) || (d_video->demuxer->file_format == DEMUXER_TYPE_AVI)) {
// display info: // display info:
#if 0 #if 0
@ -84,10 +112,10 @@ switch(d_video->demuxer->file_format){
// goto mpeg_header_parser; // goto mpeg_header_parser;
} }
#endif #endif
}
break; break;
} }
case DEMUXER_TYPE_MPEG4_ES: case VIDEO_MPEG4: {
case DEMUXER_TYPE_MPEG4_IN_TS: {
videobuf_len=0; videobuf_code_len=0; videobuf_len=0; videobuf_code_len=0;
mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for Video Object Start code... ");fflush(stdout); mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for Video Object Start code... ");fflush(stdout);
while(1){ while(1){
@ -107,7 +135,7 @@ switch(d_video->demuxer->file_format){
mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for Video Object Layer Start code... ");fflush(stdout); mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for Video Object Layer Start code... ");fflush(stdout);
while(1){ while(1){
int i=sync_video_packet(d_video); int i=sync_video_packet(d_video);
printf("0x%X\n",i); mp_msg(MSGT_DECVIDEO,MSGL_V,"M4V: 0x%X\n",i);
if(i>=0x120 && i<=0x12F) break; // found it! if(i>=0x120 && i<=0x12F) break; // found it!
if(!i || !read_video_packet(d_video)){ if(!i || !read_video_packet(d_video)){
mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n"); mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
@ -127,7 +155,7 @@ switch(d_video->demuxer->file_format){
sh_video->format=0x10000004; sh_video->format=0x10000004;
break; break;
} }
case DEMUXER_TYPE_H264_ES: { case VIDEO_H264: {
videobuf_len=0; videobuf_code_len=0; videobuf_len=0; videobuf_code_len=0;
mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence parameter set... ");fflush(stdout); mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for sequence parameter set... ");fflush(stdout);
while(1){ while(1){
@ -147,7 +175,7 @@ switch(d_video->demuxer->file_format){
mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for picture parameter set... ");fflush(stdout); mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for picture parameter set... ");fflush(stdout);
while(1){ while(1){
int i=sync_video_packet(d_video); int i=sync_video_packet(d_video);
printf("0x%X\n",i); mp_msg(MSGT_DECVIDEO,MSGL_V,"H264: 0x%X\n",i);
if((i&~0x60) == 0x108 && i != 0x108) break; // found it! if((i&~0x60) == 0x108 && i != 0x108) break; // found it!
if(!i || !read_video_packet(d_video)){ if(!i || !read_video_packet(d_video)){
mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n"); mp_msg(MSGT_DECVIDEO,MSGL_V,"NONE :(\n");
@ -167,18 +195,7 @@ switch(d_video->demuxer->file_format){
sh_video->format=0x10000005; sh_video->format=0x10000005;
break; break;
} }
#ifdef STREAMING_LIVE_DOT_COM case VIDEO_MPEG12: {
case DEMUXER_TYPE_RTP:
// If the RTP stream is a MPEG stream, then we use this code to check
// for MPEG headers:
if (!demux_is_mpeg_rtp_stream(d_video->demuxer)) break;
// otherwise fall through to...
#endif
case DEMUXER_TYPE_PVA:
case DEMUXER_TYPE_MPEG_TS:
case DEMUXER_TYPE_MPEG_ES:
case DEMUXER_TYPE_MPEG_TY:
case DEMUXER_TYPE_MPEG_PS: {
//mpeg_header_parser: //mpeg_header_parser:
// Find sequence_header first: // Find sequence_header first:
videobuf_len=0; videobuf_code_len=0; videobuf_len=0; videobuf_code_len=0;
@ -244,7 +261,7 @@ switch(d_video->demuxer->file_format){
sh_video->aspect=0.0; sh_video->aspect=0.0;
break; break;
default: default:
fprintf(stderr,"Detected unknown aspect_ratio_information in mpeg sequence header.\n" mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Detected unknown aspect_ratio_information in mpeg sequence header.\n"
"Please report the aspect value (%i) along with the movie type (VGA,PAL,NTSC," "Please report the aspect value (%i) along with the movie type (VGA,PAL,NTSC,"
"SECAM) and the movie resolution (720x576,352x240,480x480,...) to the MPlayer" "SECAM) and the movie resolution (720x576,352x240,480x480,...) to the MPlayer"
" developers, so that we can add support for it!\nAssuming 1:1 aspect for now.\n", " developers, so that we can add support for it!\nAssuming 1:1 aspect for now.\n",
@ -322,7 +339,8 @@ int video_read_frame(sh_video_t* sh_video,float* frame_time_ptr,unsigned char**
*start=NULL; *start=NULL;
if(demuxer->file_format==DEMUXER_TYPE_MPEG_ES || demuxer->file_format==DEMUXER_TYPE_MPEG_PS if(demuxer->file_format==DEMUXER_TYPE_MPEG_ES || demuxer->file_format==DEMUXER_TYPE_MPEG_PS
|| demuxer->file_format==DEMUXER_TYPE_PVA || demuxer->file_format==DEMUXER_TYPE_MPEG_TS || demuxer->file_format==DEMUXER_TYPE_PVA ||
((demuxer->file_format==DEMUXER_TYPE_MPEG_TS) && ((sh_video->format==0x10000001) || (sh_video->format==0x10000002)))
|| demuxer->file_format==DEMUXER_TYPE_MPEG_TY || demuxer->file_format==DEMUXER_TYPE_MPEG_TY
#ifdef STREAMING_LIVE_DOT_COM #ifdef STREAMING_LIVE_DOT_COM
|| (demuxer->file_format==DEMUXER_TYPE_RTP && demux_is_mpeg_rtp_stream(demuxer)) || (demuxer->file_format==DEMUXER_TYPE_RTP && demux_is_mpeg_rtp_stream(demuxer))
@ -413,7 +431,7 @@ int video_read_frame(sh_video_t* sh_video,float* frame_time_ptr,unsigned char**
telecine=1; telecine=1;
} }
} else if((demuxer->file_format==DEMUXER_TYPE_MPEG4_ES) || (demuxer->file_format==DEMUXER_TYPE_MPEG4_IN_TS)){ } else if((demuxer->file_format==DEMUXER_TYPE_MPEG4_ES) || ((demuxer->file_format==DEMUXER_TYPE_MPEG_TS) && (sh_video->format==0x10000004))){
// //
while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){ while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
int i=sync_video_packet(d_video); int i=sync_video_packet(d_video);
@ -423,7 +441,7 @@ int video_read_frame(sh_video_t* sh_video,float* frame_time_ptr,unsigned char**
*start=videobuffer; in_size=videobuf_len; *start=videobuffer; in_size=videobuf_len;
videobuf_len=0; videobuf_len=0;
} else if(demuxer->file_format==DEMUXER_TYPE_H264_ES){ } else if(demuxer->file_format==DEMUXER_TYPE_H264_ES || ((demuxer->file_format==DEMUXER_TYPE_MPEG_TS) && (sh_video->format==0x10000005))){
// //
while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){ while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){
int i=sync_video_packet(d_video); int i=sync_video_packet(d_video);
@ -494,7 +512,7 @@ int video_read_frame(sh_video_t* sh_video,float* frame_time_ptr,unsigned char**
} }
if(demuxer->file_format==DEMUXER_TYPE_MPEG_PS || if(demuxer->file_format==DEMUXER_TYPE_MPEG_PS ||
demuxer->file_format==DEMUXER_TYPE_MPEG_TS || ((demuxer->file_format==DEMUXER_TYPE_MPEG_TS) && ((sh_video->format==0x10000001) || (sh_video->format==0x10000002))) ||
demuxer->file_format==DEMUXER_TYPE_MPEG_ES || demuxer->file_format==DEMUXER_TYPE_MPEG_ES ||
demuxer->file_format==DEMUXER_TYPE_MPEG_TY){ demuxer->file_format==DEMUXER_TYPE_MPEG_TY){