From 92afb8ee8a9f9af13ff4fbb39601abf749aaa43c Mon Sep 17 00:00:00 2001 From: Joshua Moerman Date: Wed, 21 Apr 2021 14:28:35 +0200 Subject: [PATCH] old changes --- CMakeLists.txt | 27 ++++++++++++++++++++------- lib/CMakeLists.txt | 2 +- lib/image_io.cpp | 34 ++++++++++++++++++++++++++-------- src/CMakeLists.txt | 2 +- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 77ad062..88e2eef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,15 +1,28 @@ project(Mozaic) cmake_minimum_required(VERSION 2.8) -add_definitions(-std=c++1y) +set(CMAKE_CXX_STANDARD 14) + + +find_path(AVCODEC_INCLUDE_DIR libavcodec/avcodec.h) +find_library(AVCODEC_LIBRARY avcodec) + +find_path(AVFORMAT_INCLUDE_DIR libavformat/avformat.h) +find_library(AVFORMAT_LIBRARY avformat) + +find_path(AVUTIL_INCLUDE_DIR libavutil/avutil.h) +find_library(AVUTIL_LIBRARY avutil) + +find_path(AVDEVICE_INCLUDE_DIR libavdevice/avdevice.h) +find_library(AVDEVICE_LIBRARY avdevice) + +find_path(SWSCALE_INCLUDE_DIR libswscale/swscale.h) +find_library(SWSCALE_LIBRARY swscale) + find_package(Boost REQUIRED COMPONENTS program_options filesystem system serialization) -include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) -set(libs ${libs} ${Boost_LIBRARIES}) +include_directories(SYSTEM ${Boost_INCLUDE_DIRS} ${AVCODEC_INCLUDE_DIR} ${AVFORMAT_INCLUDE_DIR} ${AVUTIL_INCLUDE_DIR} ${AVDEVICE_INCLUDE_DIR} ${SWSCALE_INCLUDE_DIR}) +set(libs ${libs} ${Boost_LIBRARIES} ${AVCODEC_LIBRARY} ${AVFORMAT_LIBRARY} ${AVUTIL_LIBRARY} ${AVDEVICE_LIBRARY} ${SWSCALE_LIBRARY}) -# add_subdirectory("contrib") add_subdirectory("lib") add_subdirectory("src") - -# file(GLOB resources "resources/*") -# file(COPY ${resources} DESTINATION ${CMAKE_BINARY_DIR}) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index dda9976..ea54b79 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -2,7 +2,7 @@ file(GLOB_RECURSE sources "*.cpp") file(GLOB_RECURSE headers "*.hpp") -set(libs avformat avcodec avutil swscale) +set(libs ${libs}) add_library(common ${headers} ${sources}) target_link_libraries(common ${libs}) diff --git a/lib/image_io.cpp b/lib/image_io.cpp index 3c24b1f..f91af31 100644 --- a/lib/image_io.cpp +++ b/lib/image_io.cpp @@ -1,7 +1,7 @@ #include "image_io.hpp" #include "utilities.hpp" -#include +#include "av/sws.hpp" extern "C" { #include @@ -159,11 +159,29 @@ void encode_as_jpg(const av::frame& frame, const std::string& filename){ const auto opened_codec = av::codec_open(codec_ctx, codec, nullptr); - const auto buffer_size = avpicture_get_size(pix_fmt, codec_ctx->width, codec_ctx->height); - std::vector buffer(make_u(buffer_size), 0); - const auto output_size = avcodec_encode_video(codec_ctx.get(), buffer.data(), buffer_size, frame.get()); - assert(output_size <= buffer_size); - - std::ofstream file(filename); - file.write(reinterpret_cast(buffer.data()), output_size); +// const auto buffer_size = avpicture_get_size(pix_fmt, codec_ctx->width, codec_ctx->height); +// std::vector buffer(make_u(buffer_size), 0); +// const auto output_size = avcodec_encode_video(codec_ctx.get(), buffer.data(), buffer_size, frame.get()); +// assert(output_size <= buffer_size); + if(avcodec_send_frame(codec_ctx.get(), frame.get()) < 0) { + std::cerr << "Error when encoding frame" << std::endl; + } + + AVPacket * p = av_packet_alloc(); + std::ofstream file(filename); + + int ret = 0; + while (ret >= 0) { + ret = avcodec_receive_packet(codec_ctx.get(), p); + if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) + return; + else if (ret < 0) { + std::cerr << "error" << std::endl; + return; + } + std::clog << "encoded frame " << p->pts << " of size " << p->size << std::endl; + + file.write(reinterpret_cast(p->data), p->size); + av_packet_unref(p); + } } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1848345..a71cf9b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,7 +3,7 @@ set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) file(GLOB sources "*.cpp") -set(libs common avformat avcodec avutil swscale ${Boost_LIBRARIES}) +set(libs common ${libs}) foreach(source ${sources}) get_filename_component(exec ${source} NAME_WE)