virtual void onData(LiveTrack* track, uint8_t* p_buffer, int i_size, int i_truncated_bytes, int64_t pts, int64_t dts) { //std::cout << "Got Data. size = " << i_size << "; truncated bytes = " << i_truncated_bytes << "; pts = " << pts << "; dts = " << dts << std::endl; //std::cout << "Got Data. size = " << i_size << "; pts = " << pts << std::endl; int consumed; if (track->getFormat().i_codec != VLC_CODEC_H264) return; //std::cout << "Got H264 Data. size = " << i_size << "; truncated bytes = " << i_truncated_bytes << "; NAL type = " << (int)(p_buffer[4] & 0x1f) << std::endl; if (!decoder) { decoder = new VideoDecoder(); decoder->openCodec(0); if (track->getFormat().p_extra) { decoder->decode(track->getFormat().p_extra, track->getFormat().i_extra, consumed); } } uint8_t* tmp = p_buffer; int left = i_size; while (left) { AVFrame* ret = decoder->decode(tmp, left, consumed); if (ret) { av_frame_unref(ret); #ifdef TEST_MULTI_CLIENT std::cout << "client " << this << " got frame!!!\n"; #endif } tmp += consumed; left -= consumed; } }
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString file = "test.avi"; int idx = a.arguments().indexOf("-f"); if (idx > 0) file = a.arguments().at(idx + 1); QString decName("FFmpeg"); idx = a.arguments().indexOf("-vc"); if (idx > 0) decName = a.arguments().at(idx + 1); VideoDecoderId cid = VideoDecoderFactory::id(decName.toStdString()); if (cid <= 0) { qWarning("Can not find decoder: %s", decName.toUtf8().constData()); return 1; } VideoDecoder *dec = VideoDecoderFactory::create(cid); AVDemuxer demux; if (!demux.loadFile(file)) { qWarning("Failed to load file: %s", file.toUtf8().constData()); return 1; } dec->setCodecContext(demux.videoCodecContext()); dec->prepare(); dec->open(); QElapsedTimer timer; timer.start(); int count = 0; VideoFrame frame; while (!demux.atEnd()) { if (!demux.readFrame()) continue; if (dec->decode(demux.packet()->data)) { /* * TODO: may contains more than 1 frames * map from gpu or not? */ //frame = dec->frame().clone(); count++; } } qint64 elapsed = timer.elapsed(); int msec = elapsed/1000LL; qDebug("decoded frames: %d, time: %d, average speed: %d", count, msec, count/msec); return 0; }