]> git.sesse.net Git - nageru/blobdiff - nageru/quicksync_encoder.cpp
When exporting interpolated files, make sure they are seekable.
[nageru] / nageru / quicksync_encoder.cpp
index 5200ce61b4911ab4e18692da0bfc17b483ae548d..0d9a796960c69cafb5ffb887154e03739a141567 100644 (file)
@@ -45,16 +45,16 @@ extern "C" {
 }  // namespace
 
 #include "audio_encoder.h"
-#include "context.h"
+#include "shared/context.h"
 #include "defs.h"
-#include "disk_space_estimator.h"
-#include "ffmpeg_raii.h"
+#include "shared/disk_space_estimator.h"
+#include "shared/ffmpeg_raii.h"
 #include "flags.h"
-#include "mux.h"
+#include "shared/mux.h"
 #include "print_latency.h"
 #include "quicksync_encoder_impl.h"
 #include "ref_counted_frame.h"
-#include "timebase.h"
+#include "shared/timebase.h"
 #include "x264_encoder.h"
 
 using namespace movit;
@@ -1481,13 +1481,18 @@ void QuickSyncEncoderImpl::storage_task_thread()
 void QuickSyncEncoderImpl::release_encode()
 {
        for (unsigned i = 0; i < SURFACE_NUM; i++) {
-               vaDestroyBuffer(va_dpy->va_dpy, gl_surfaces[i].coded_buf);
-               vaDestroySurfaces(va_dpy->va_dpy, &gl_surfaces[i].src_surface, 1);
-               vaDestroySurfaces(va_dpy->va_dpy, &gl_surfaces[i].ref_surface, 1);
+               VAStatus va_status = vaDestroyBuffer(va_dpy->va_dpy, gl_surfaces[i].coded_buf);
+               CHECK_VASTATUS(va_status, "vaDestroyBuffer");
+               va_status = vaDestroySurfaces(va_dpy->va_dpy, &gl_surfaces[i].src_surface, 1);
+               CHECK_VASTATUS(va_status, "vaDestroySurfaces");
+               va_status = vaDestroySurfaces(va_dpy->va_dpy, &gl_surfaces[i].ref_surface, 1);
+               CHECK_VASTATUS(va_status, "vaDestroySurfaces");
        }
 
-       vaDestroyContext(va_dpy->va_dpy, context_id);
-       vaDestroyConfig(va_dpy->va_dpy, config_id);
+       VAStatus va_status = vaDestroyContext(va_dpy->va_dpy, context_id);
+       CHECK_VASTATUS(va_status, "vaDestroyContext");
+       va_status = vaDestroyConfig(va_dpy->va_dpy, config_id);
+       CHECK_VASTATUS(va_status, "vaDestroyConfig");
 }
 
 void QuickSyncEncoderImpl::release_gl_resources()
@@ -1792,8 +1797,7 @@ void QuickSyncEncoderImpl::open_output_file(const std::string &filename)
 {
        AVFormatContext *avctx = avformat_alloc_context();
        avctx->oformat = av_guess_format(NULL, filename.c_str(), NULL);
-       assert(filename.size() < sizeof(avctx->filename) - 1);
-       strcpy(avctx->filename, filename.c_str());
+       avctx->url = strdup(filename.c_str());
 
        string url = "file:" + filename;
        int ret = avio_open2(&avctx->pb, url.c_str(), AVIO_FLAG_WRITE, &avctx->interrupt_callback, NULL);
@@ -1813,8 +1817,8 @@ void QuickSyncEncoderImpl::open_output_file(const std::string &filename)
        {
                lock_guard<mutex> lock(file_audio_encoder_mutex);
                AVCodecParametersWithDeleter audio_codecpar = file_audio_encoder->get_codec_parameters();
-               file_mux.reset(new Mux(avctx, frame_width, frame_height, Mux::CODEC_H264, video_extradata, audio_codecpar.get(), TIMEBASE,
-                       std::bind(&DiskSpaceEstimator::report_write, disk_space_estimator, filename, _1),
+               file_mux.reset(new Mux(avctx, frame_width, frame_height, Mux::CODEC_H264, video_extradata, audio_codecpar.get(), get_color_space(global_flags.ycbcr_rec709_coefficients), Mux::WITH_AUDIO, TIMEBASE,
+                       std::bind(&DiskSpaceEstimator::report_append, disk_space_estimator, filename, _1),
                        Mux::WRITE_BACKGROUND,
                        { &current_file_mux_metrics, &total_mux_metrics }));
        }
@@ -1939,8 +1943,6 @@ void QuickSyncEncoderImpl::add_packet_for_uncompressed_frame(int64_t pts, int64_
        stream_mux->add_packet(pkt, pts, pts);
 }
 
-namespace {
-
 void memcpy_with_pitch(uint8_t *dst, const uint8_t *src, size_t src_width, size_t dst_pitch, size_t height)
 {
        if (src_width == dst_pitch) {
@@ -1954,8 +1956,6 @@ void memcpy_with_pitch(uint8_t *dst, const uint8_t *src, size_t src_width, size_
        }
 }
 
-}  // namespace
-
 void QuickSyncEncoderImpl::pass_frame(QuickSyncEncoderImpl::PendingFrame frame, int display_frame_num, int64_t pts, int64_t duration)
 {
        // Wait for the GPU to be done with the frame.