static void dvd_video_push(dvd_player_t *dp) { media_buf_t *mb; media_codec_t *cw = dp->dp_video; media_pipe_t *mp = dp->dp_mp; if(cw == NULL) return; mb = media_buf_alloc(); mb->mb_cw = media_codec_ref(cw); mb->mb_size = 0; mb->mb_data = NULL; mb->mb_aspect_override = dp->dp_aspect_override; mb->mb_disable_deinterlacer = 1; mb->mb_data_type = MB_VIDEO; mb->mb_duration = cw->codec_ctx->ticks_per_frame * 1000000LL * av_q2d(cw->codec_ctx->time_base); mb->mb_pts = AV_NOPTS_VALUE; mb->mb_dts = AV_NOPTS_VALUE; mb->mb_epoch = dp->dp_epoch; mb_enqueue_always(mp, &mp->mp_video, mb); }
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; }