void video_decoder_scan_ext_sub(video_decoder_t *vd, int64_t pts) { pts -= vd->vd_mp->mp_svdelta; if(vd->vd_ext_subtitles != NULL) subtitles_pick(vd->vd_ext_subtitles, pts, vd); }
void video_decoder_scan_ext_sub(video_decoder_t *vd, int64_t pts) { pts -= vd->vd_mp->mp_svdelta; pts -= vd->vd_mp->mp_pts_delta_for_subs; if(vd->vd_ext_subtitles != NULL) { ext_subtitle_entry_t *ese = subtitles_pick(vd->vd_ext_subtitles, pts); if(ese != NULL) vd->vd_ext_subtitles->es_decode(vd, vd->vd_ext_subtitles, ese); } }
static void video_decoder_set_current_time(video_decoder_t *vd, int64_t ts, int epoch, int64_t delta) { if(ts == PTS_UNSET) return; mp_set_current_time(vd->vd_mp, ts, epoch, delta); vd->vd_subpts = ts - vd->vd_mp->mp_svdelta - delta; if(vd->vd_ext_subtitles != NULL) subtitles_pick(vd->vd_ext_subtitles, vd->vd_subpts, vd->vd_mp); }
static event_t * get_packet_v(rtmp_t *r, uint8_t *data, size_t size, int64_t dts, media_pipe_t *mp) { uint8_t flags; uint8_t type = 0; enum CodecID id; int d = 0; event_t *e; if(r->r->m_read.flags & RTMP_READ_SEEKING) return NULL; if(size < 2) return NULL; flags = *data++; size--; switch(flags & 0xf) { case 7: type = *data++; size--; id = CODEC_ID_H264; if(size < 3) return NULL; d = (AMF_DecodeInt24((char *)data) + 0xff800000) ^ 0xff800000; data += 3; size -= 3; break; case 4: type = *data++; size--; id = CODEC_ID_VP6F; break; default: return NULL; } if(r->vcodec == NULL) { AVCodecContext *ctx; media_codec_params_t mcp = {0}; switch(id) { case CODEC_ID_H264: if(type != 0 || size < 0) return NULL; ctx = avcodec_alloc_context(); ctx->extradata = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE); memcpy(ctx->extradata, data, size); ctx->extradata_size = size; break; case CODEC_ID_VP6F: if(size < 1) return NULL; ctx = avcodec_alloc_context(); ctx->extradata = av_mallocz(1 + FF_INPUT_BUFFER_PADDING_SIZE); memcpy(ctx->extradata, &type, 1); ctx->extradata_size = 1; break; default: abort(); } mcp.width = r->width; mcp.height = r->height; r->vcodec = media_codec_create(id, 0, NULL, ctx, &mcp, mp); return NULL; } int skip = 0; int64_t pts = 1000LL * (dts + d); dts = 1000LL * dts; if(d < 0 || dts < r->seekpos) { skip = 1; r->in_seek_skip = 1; } else if(r->in_seek_skip) { skip = 2; r->in_seek_skip = 0; } r->lastdts = dts; e = sendpkt(r, &r->mp->mp_video, r->vcodec, dts, pts, AV_NOPTS_VALUE, data, size, skip, MB_VIDEO, r->vframeduration); if(e != NULL) return e; if(pts > r->lastsubpts) r->lastsubpts = r->subpts = pts; else r->subpts = AV_NOPTS_VALUE; if(r->subpts != AV_NOPTS_VALUE && r->sub != NULL) { subtitle_entry_t *se = subtitles_pick(r->sub, r->subpts); if(se != NULL) mb_enqueue_always(mp, &r->mp->mp_video, subtitles_make_pkt(se)); } return NULL; }