Mercurial > mplayer.hg
comparison libmpdemux/demux_ts.c @ 20951:55798b61b8ca
implemented DEMUXER_CTRL_SWITCH_VIDEO
author | nicodvb |
---|---|
date | Thu, 16 Nov 2006 21:30:35 +0000 |
parents | f74eb19ac068 |
children | 9f972d3318a6 |
comparison
equal
deleted
inserted
replaced
20950:4d9da4734f83 | 20951:55798b61b8ca |
---|---|
229 uint16_t pmt_cnt; | 229 uint16_t pmt_cnt; |
230 uint32_t prog; | 230 uint32_t prog; |
231 uint32_t vbitrate; | 231 uint32_t vbitrate; |
232 int keep_broken; | 232 int keep_broken; |
233 int last_aid; | 233 int last_aid; |
234 int last_vid; | |
234 char packet[TS_FEC_PACKET_SIZE]; | 235 char packet[TS_FEC_PACKET_SIZE]; |
235 TS_stream_info vstr, astr; | 236 TS_stream_info vstr, astr; |
236 } ts_priv_t; | 237 } ts_priv_t; |
237 | 238 |
238 | 239 |
932 | 933 |
933 if(params.vtype != UNKNOWN) | 934 if(params.vtype != UNKNOWN) |
934 { | 935 { |
935 ES_stream_t *es = priv->ts.pids[params.vpid]; | 936 ES_stream_t *es = priv->ts.pids[params.vpid]; |
936 sh_video = new_sh_video_vid(demuxer, 0, es->pid); | 937 sh_video = new_sh_video_vid(demuxer, 0, es->pid); |
938 priv->ts.streams[params.vpid].id = 0; | |
939 priv->ts.streams[params.vpid].sh = sh_video; | |
940 priv->ts.streams[params.vpid].type = TYPE_VIDEO; | |
941 priv->last_vid = 0; | |
942 demuxer->video->id = 0; | |
943 | |
937 if(params.vtype == VIDEO_AVC && es->extradata && es->extradata_len) | 944 if(params.vtype == VIDEO_AVC && es->extradata && es->extradata_len) |
938 { | 945 { |
939 int w = 0, h = 0; | 946 int w = 0, h = 0; |
940 sh_video->bih = (BITMAPINFOHEADER *) calloc(1, sizeof(BITMAPINFOHEADER) + es->extradata_len); | 947 sh_video->bih = (BITMAPINFOHEADER *) calloc(1, sizeof(BITMAPINFOHEADER) + es->extradata_len); |
941 sh_video->bih->biSize= sizeof(BITMAPINFOHEADER) + es->extradata_len; | 948 sh_video->bih->biSize= sizeof(BITMAPINFOHEADER) + es->extradata_len; |
2705 priv->ts.streams[pid].type = TYPE_AUDIO; | 2712 priv->ts.streams[pid].type = TYPE_AUDIO; |
2706 mp_msg(MSGT_DEMUX, MSGL_V, "\r\nADDED AUDIO PID %d, type: %x stream n. %d\r\n", pid, sh->format, priv->last_aid); | 2713 mp_msg(MSGT_DEMUX, MSGL_V, "\r\nADDED AUDIO PID %d, type: %x stream n. %d\r\n", pid, sh->format, priv->last_aid); |
2707 } | 2714 } |
2708 } | 2715 } |
2709 | 2716 |
2717 if((IS_VIDEO(tss->type) || IS_VIDEO(tss->subtype)) && is_start && !priv->ts.streams[pid].sh && priv->last_vid+1 < MAX_V_STREAMS) | |
2718 { | |
2719 sh_video_t *sh = new_sh_video_vid(demuxer, priv->last_vid+1, pid); | |
2720 if(sh) | |
2721 { | |
2722 sh->format = IS_VIDEO(tss->type) ? tss->type : tss->subtype; | |
2723 sh->ds = demuxer->video; | |
2724 | |
2725 priv->last_vid++; | |
2726 priv->ts.streams[pid].id = priv->last_vid; | |
2727 priv->ts.streams[pid].sh = sh; | |
2728 priv->ts.streams[pid].type = TYPE_VIDEO; | |
2729 mp_msg(MSGT_DEMUX, MSGL_V, "\r\nADDED VIDEO PID %d, type: %x stream n. %d\r\n", pid, sh->format, priv->last_vid); | |
2730 } | |
2731 } | |
2732 | |
2710 if((pid == demuxer->sub->id)) //or the lang is right | 2733 if((pid == demuxer->sub->id)) //or the lang is right |
2711 { | 2734 { |
2712 pid_type = SPU_DVD; | 2735 pid_type = SPU_DVD; |
2713 } | 2736 } |
2714 | 2737 |
2715 if(is_video && (demuxer->video->id == tss->pid)) | 2738 if(is_video && (demuxer->video->id == priv->ts.streams[pid].id)) |
2716 { | 2739 { |
2717 ds = demuxer->video; | 2740 ds = demuxer->video; |
2718 | 2741 |
2719 dp = &priv->fifo[1].pack; | 2742 dp = &priv->fifo[1].pack; |
2720 dp_offset = &priv->fifo[1].offset; | 2743 dp_offset = &priv->fifo[1].offset; |
3194 | 3217 |
3195 *((int*)arg) = demuxer->audio->id; | 3218 *((int*)arg) = demuxer->audio->id; |
3196 return DEMUXER_CTRL_OK; | 3219 return DEMUXER_CTRL_OK; |
3197 } | 3220 } |
3198 | 3221 |
3222 case DEMUXER_CTRL_SWITCH_VIDEO: | |
3223 { | |
3224 sh_video_t *sh_video = demuxer->video->sh; | |
3225 sh_video_t *sh_v = NULL; | |
3226 int i, n; | |
3227 if(!sh_video) | |
3228 return DEMUXER_CTRL_NOTIMPL; | |
3229 | |
3230 n = *((int*)arg); | |
3231 if(n < 0) | |
3232 { | |
3233 for(i = 0; i < 8192; i++) | |
3234 { | |
3235 if(priv->ts.streams[i].id == demuxer->video->id && priv->ts.streams[i].type == TYPE_VIDEO) | |
3236 break; | |
3237 } | |
3238 | |
3239 while(!sh_v) | |
3240 { | |
3241 i = (i+1) % 8192; | |
3242 if(priv->ts.streams[i].id == demuxer->video->id) //we made a complete loop | |
3243 break; | |
3244 if(priv->ts.streams[i].type == TYPE_VIDEO) | |
3245 sh_v = (sh_video_t*)priv->ts.streams[i].sh; | |
3246 } | |
3247 } | |
3248 else if(n <= priv->last_vid) | |
3249 { | |
3250 for(i = 0; i < 8192; i++) | |
3251 { | |
3252 if(priv->ts.streams[i].id == n && priv->ts.streams[i].type == TYPE_VIDEO) | |
3253 { | |
3254 sh_v = (sh_video_t*)priv->ts.streams[i].sh; | |
3255 break; | |
3256 } | |
3257 } | |
3258 } | |
3259 | |
3260 if(sh_v) | |
3261 { | |
3262 if(demuxer->video->id != priv->ts.streams[i].id) | |
3263 reset_fifos(priv, 0, 1, 0); | |
3264 demuxer->video->id = priv->ts.streams[i].id; | |
3265 demuxer->video->sh = sh_v; | |
3266 ds_free_packs(demuxer->video); | |
3267 mp_msg(MSGT_DEMUX, MSGL_V, "\r\ndemux_ts, switched to video pid %d, id: %d, sh: %p\r\n", i, demuxer->video->id, sh_v); | |
3268 } | |
3269 | |
3270 *((int*)arg) = demuxer->video->id; | |
3271 return DEMUXER_CTRL_OK; | |
3272 } | |
3199 | 3273 |
3200 default: | 3274 default: |
3201 return DEMUXER_CTRL_NOTIMPL; | 3275 return DEMUXER_CTRL_NOTIMPL; |
3202 } | 3276 } |
3203 } | 3277 } |