VideoFrame VideoDecoderFFmpeg::frame() { DPTR_D(VideoDecoderFFmpeg); /*qDebug("color space: %d, range: %d, prim: %d, t: %d" , d.codec_ctx->colorspace, d.codec_ctx->color_range , d.codec_ctx->color_primaries, d.codec_ctx->color_trc); */ if (d.frame->width <= 0 || d.frame->height <= 0 || !d.codec_ctx) return VideoFrame(); // it's safe if width, height, pixfmt will not change, only data change VideoFrame frame(d.frame->width, d.frame->height, VideoFormat((int)d.codec_ctx->pix_fmt)); frame.setDisplayAspectRatio(d.getDAR(d.frame)); frame.setBits(d.frame->data); frame.setBytesPerLine(d.frame->linesize); frame.setTimestamp((double)d.frame->pkt_pts/1000.0); // in s. what about AVFrame.pts? frame.setMetaData(QStringLiteral("avbuf"), QVariant::fromValue(AVFrameBuffersRef(new AVFrameBuffers(d.frame)))); d.updateColorDetails(&frame); return frame; }
VideoFrame VideoDecoderFFmpegBase::frame() { DPTR_D(VideoDecoderFFmpegBase); if (d.frame->width <= 0 || d.frame->height <= 0 || !d.codec_ctx) return VideoFrame(); // it's safe if width, height, pixfmt will not change, only data change VideoFrame frame(d.frame->width, d.frame->height, VideoFormat((int)d.codec_ctx->pix_fmt)); frame.setDisplayAspectRatio(d.getDAR(d.frame)); frame.setBits(d.frame->data); frame.setBytesPerLine(d.frame->linesize); // in s. TODO: what about AVFrame.pts? av_frame_get_best_effort_timestamp? move to VideoFrame::from(AVFrame*) frame.setTimestamp((double)d.frame->pkt_pts/1000.0); frame.setMetaData(QStringLiteral("avbuf"), QVariant::fromValue(AVFrameBuffersRef(new AVFrameBuffers(d.frame)))); d.updateColorDetails(&frame); if (frame.format().hasPalette()) { frame.setMetaData(QStringLiteral("pallete"), QByteArray((const char*)d.frame->data[1], 256*4)); } return frame; }