static bool ffmpeg_image_init(struct ffmpeg_image *info, const char *file) { int ret; memset(info, 0, sizeof(struct ffmpeg_image)); info->file = file; info->stream_idx = -1; ret = avformat_open_input(&info->fmt_ctx, file, NULL, NULL); if (ret < 0) { blog(LOG_WARNING, "Failed to open file '%s': %s", info->file, av_err2str(ret)); return false; } ret = avformat_find_stream_info(info->fmt_ctx, NULL); if (ret < 0) { blog(LOG_WARNING, "Could not find stream info for file '%s':" " %s", info->file, av_err2str(ret)); goto fail; } if (!ffmpeg_image_open_decoder_context(info)) goto fail; info->cx = info->decoder_ctx->width; info->cy = info->decoder_ctx->height; info->format = info->decoder_ctx->pix_fmt; return true; fail: ffmpeg_image_free(info); return false; }
texture_t gs_create_texture_from_file(const char *file) { struct ffmpeg_image image; texture_t tex = NULL; if (ffmpeg_image_init(&image, file)) { uint8_t *data = malloc(image.cx * image.cy * 4); if (ffmpeg_image_decode(&image, data, image.cx * 4)) { tex = gs_create_texture(image.cx, image.cy, convert_format(image.format), 1, (const uint8_t**)&data, 0); } ffmpeg_image_free(&image); free(data); } return tex; }