| | |
| | | #include "worker/decoder.hpp" |
| | | #include "worker/rec.hpp" |
| | | |
| | | #include "CUDALERP.h" |
| | | |
| | | using namespace logif; |
| | | using namespace ffwrapper; |
| | | |
| | |
| | | |
| | | Wrapper::Wrapper() |
| | | :input_url_("") |
| | | ,scale_w_(0) |
| | | ,scale_h_(0) |
| | | ,scale_f_(SWS_POINT) |
| | | ,audio_(false) |
| | | ,gb_(0) |
| | | ,cpu_(0) |
| | |
| | | |
| | | Wrapper::Wrapper(const char *logfile) |
| | | :input_url_("") |
| | | ,scale_w_(0) |
| | | ,scale_h_(0) |
| | | ,scale_f_(SWS_POINT) |
| | | ,audio_(false) |
| | | ,gb_(0) |
| | | ,cpu_(0) |
| | |
| | | stream_ = new stream(in, 3 * in->getFPS()); |
| | | // stream_->AudioSwitch(audio_); |
| | | |
| | | decoder_ = new decoder(in, scale_w_, scale_h_, scale_f_); |
| | | decoder_ = new decoder(in); |
| | | |
| | | rec_->Load(in); |
| | | if(fn_rec_lazy_) { |
| | |
| | | run_dec_ = true; |
| | | } |
| | | |
| | | void Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int64_t *id){ |
| | | void Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id){ |
| | | if (decoder_){ |
| | | decoder_->GetFrame(data, w, h, id); |
| | | decoder_->GetFrame(data, w, h, format, length, id); |
| | | } |
| | | } |
| | | |
| | |
| | | return flag; |
| | | } |
| | | |
| | | /////////////////////////////////////////////////////////// |
| | | typedef struct _conv |
| | | { |
| | | int srcW; |
| | | int srcH; |
| | | int srcF; |
| | | int dstW; |
| | | int dstH; |
| | | cvbridge *b; |
| | | }Conv; |
| | | |
| | | void *CreateConvertor(const int srcW, const int srcH, const int srcFormat, |
| | | const int dstW, const int dstH, const int flag){ |
| | | AVPixelFormat pix_fmt = AV_PIX_FMT_BGR24; |
| | | auto bridge = new cvbridge( |
| | | srcW, srcH, srcFormat, |
| | | dstW, dstH, pix_fmt, flag); |
| | | if (!bridge) return NULL; |
| | | |
| | | Conv *c = (Conv*)malloc(sizeof(Conv)); |
| | | c->b = bridge; |
| | | c->dstW = dstW; |
| | | c->dstH = dstH; |
| | | c->srcW = srcW; |
| | | c->srcH = srcH; |
| | | c->srcF = srcFormat; |
| | | |
| | | return c; |
| | | } |
| | | |
| | | uint8_t *Convert(void *h, uint8_t *src){ |
| | | Conv *c = (Conv*)h; |
| | | |
| | | auto b = c->b; |
| | | |
| | | AVFrame *tmp_frm = av_frame_alloc(); |
| | | tmp_frm->format = (AVPixelFormat)c->srcF; |
| | | tmp_frm->width = c->srcW; |
| | | tmp_frm->height = c->srcH; |
| | | |
| | | //create a AVPicture frame from the opencv Mat input image |
| | | int ret = avpicture_fill((AVPicture *)tmp_frm, |
| | | (uint8_t *)src, |
| | | (AVPixelFormat)tmp_frm->format, |
| | | tmp_frm->width, |
| | | tmp_frm->height); |
| | | |
| | | unsigned char *picData = NULL; |
| | | if (ret > 0){ |
| | | picData = (unsigned char*)malloc(c->dstW * c->dstH * 3); |
| | | b->copyPicture(picData, tmp_frm); |
| | | } |
| | | |
| | | av_frame_free(&tmp_frm); |
| | | |
| | | return picData; |
| | | } |
| | | |
| | | void DestoryConvertor(void *h){ |
| | | Conv *c = (Conv*)h; |
| | | delete c->b; |
| | | free(c); |
| | | } |
| | | |
| | | |
| | | uint8_t* ConvertYUV2BGR(uint8_t *src, const int w, const int h, const int dst_w, const int dst_h, int *length){ |
| | | return NULL; |
| | | |
| | | // int oldw = w, oldh = h, neww = dst_w, newh = dst_h; |
| | | // // setting cache and shared modes |
| | | // cudaDeviceSetCacheConfig(cudaFuncCachePreferL1); |
| | | // cudaDeviceSetSharedMemConfig(cudaSharedMemBankSizeFourByte); |
| | | |
| | | // // allocating and transferring image and binding to texture object |
| | | // cudaChannelFormatDesc chandesc_img = cudaCreateChannelDesc(8, 0, 0, 0, cudaChannelFormatKindUnsigned); |
| | | // cudaArray* d_img_arr; |
| | | // cudaMallocArray(&d_img_arr, &chandesc_img, oldw, oldh, cudaArrayTextureGather); |
| | | // cudaMemcpyToArray(d_img_arr, 0, 0, image, oldh * oldw, cudaMemcpyHostToDevice); |
| | | // struct cudaResourceDesc resdesc_img; |
| | | // memset(&resdesc_img, 0, sizeof(resdesc_img)); |
| | | // resdesc_img.resType = cudaResourceTypeArray; |
| | | // resdesc_img.res.array.array = d_img_arr; |
| | | // struct cudaTextureDesc texdesc_img; |
| | | // memset(&texdesc_img, 0, sizeof(texdesc_img)); |
| | | // texdesc_img.addressMode[0] = cudaAddressModeClamp; |
| | | // texdesc_img.addressMode[1] = cudaAddressModeClamp; |
| | | // texdesc_img.readMode = cudaReadModeNormalizedFloat; |
| | | // texdesc_img.filterMode = cudaFilterModePoint; |
| | | // texdesc_img.normalizedCoords = 0; |
| | | // cudaTextureObject_t d_img_tex = 0; |
| | | // cudaCreateTextureObject(&d_img_tex, &resdesc_img, &texdesc_img, nullptr); |
| | | |
| | | // uint8_t* d_out = nullptr; |
| | | // cudaMalloc(&d_out, total); |
| | | |
| | | // for (int i = 0; i < warmups; ++i) CUDALERP(d_img_tex, oldw, oldh, d_out, neww, newh); |
| | | // auto start = high_resolution_clock::now(); |
| | | // for (int i = 0; i < runs; ++i) CUDALERP(d_img_tex, oldw, oldh, d_out, neww, newh); |
| | | // auto end = high_resolution_clock::now(); |
| | | // auto sum = (end - start) / runs; |
| | | |
| | | // auto h_out = new uint8_t[neww * newh]; |
| | | // cudaMemcpy(h_out, d_out, total, cudaMemcpyDeviceToHost); |
| | | } |
| | | } |
| | | |