Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- AVFrame* open_image(const char* imageFileName, int width, int height, long * bufSize)
- {
- AVFormatContext *pFormatCtx;
- if(av_open_input_file(&pFormatCtx, imageFileName, NULL, 0, NULL)!=0)
- {
- printf("Can't open image file '%s'\n", imageFileName);
- return NULL;
- }
- AVCodecContext *pCodecCtx;
- pCodecCtx = pFormatCtx->streams[0]->codec;
- pCodecCtx->width = width;
- pCodecCtx->height = height;
- pCodecCtx->pix_fmt = PIX_FMT_YUV420P;
- // Find the decoder for the video stream
- AVCodec *pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
- if (!pCodec)
- {
- printf("Codec not found\n");
- return NULL;
- }
- // Open codec
- if(avcodec_open(pCodecCtx, pCodec)<0)
- {
- printf("Could not open codec\n");
- return NULL;
- }
- AVFrame *pFrame = avcodec_alloc_frame();
- if (!pFrame)
- {
- LOGV(TAG, "Can't allocate memory for AVFrame\n");
- return NULL;
- }
- int frameFinished;
- int numBytes;
- // Determine required buffer size and allocate buffer
- numBytes = avpicture_get_size(PIX_FMT_YUVJ420P, pCodecCtx->width, pCodecCtx->height);
- // ***
- *bufSize = numBytes;
- // ***
- uint8_t *buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));
- avpicture_fill((AVPicture *) pFrame, buffer, PIX_FMT_YUVJ420P, pCodecCtx->width, pCodecCtx->height);
- // Read frame
- AVPacket packet;
- int framesNumber = 0;
- while (av_read_frame(pFormatCtx, &packet) >= 0)
- {
- if(packet.stream_index != 0)
- continue;
- int ret = avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
- if (ret > 0)
- {
- sprintf(buf, "Frame is decoded, size %d", ret);
- LOGV(TAG, buf);
- pFrame->quality = 4;
- return pFrame;
- }
- else {
- // printf("Error [%d] while decoding frame: %s\n", ret, strerror(AVERROR(ret)));
- sprintf(buf, "Error %d decoding frame: %s", ret, strerror(AVERROR(ret)));
- LOGV(TAG, buf);
- }
- }
- }
Add Comment
Please, Sign In to add comment