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 }