X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fffmpeg_file_encoder.cc;h=e9809008098536ee6591904e2047b378683d22d1;hp=cd5d473f946efb92eaf13a2840fc865b9b7ce00f;hb=f515b8daea9d28200be803bb64ff17e9f30343c4;hpb=d5ba7d135293103dba55196a3d9a9342795d6188 diff --git a/src/lib/ffmpeg_file_encoder.cc b/src/lib/ffmpeg_file_encoder.cc index cd5d473f9..e98090080 100644 --- a/src/lib/ffmpeg_file_encoder.cc +++ b/src/lib/ffmpeg_file_encoder.cc @@ -63,6 +63,7 @@ FFmpegFileEncoder::FFmpegFileEncoder ( , _video_frame_size (video_frame_size) , _video_frame_rate (video_frame_rate) , _audio_frame_rate (audio_frame_rate) + , _audio_frames (0) { _pixel_format = pixel_format (format); @@ -86,6 +87,8 @@ FFmpegFileEncoder::FFmpegFileEncoder ( _audio_codec_name = "pcm_s24le"; av_dict_set_int (&_video_options, "crf", x264_crf, 0); break; + default: + DCPOMATIC_ASSERT (false); } setup_video (); @@ -278,7 +281,11 @@ FFmpegFileEncoder::video (shared_ptr video, DCPTime time) AVFrame* frame = av_frame_alloc (); DCPOMATIC_ASSERT (frame); - _pending_images[image->data()[0]] = image; + { + boost::mutex::scoped_lock lm (_pending_images_mutex); + _pending_images[image->data()[0]] = image; + } + for (int i = 0; i < 3; ++i) { AVBufferRef* buffer = av_buffer_create(image->data()[i], image->stride()[i] * image->size().height, &buffer_free, this, 0); frame->buf[i] = av_buffer_ref (buffer); @@ -290,7 +297,8 @@ FFmpegFileEncoder::video (shared_ptr video, DCPTime time) frame->width = image->size().width; frame->height = image->size().height; frame->format = _pixel_format; - frame->pts = time.seconds() / av_q2d (_video_stream->time_base); + DCPOMATIC_ASSERT (_video_stream->time_base.num == 1); + frame->pts = time.get() * _video_stream->time_base.den / DCPTime::HZ; AVPacket packet; av_init_packet (&packet); @@ -385,6 +393,9 @@ FFmpegFileEncoder::audio_frame (int size) DCPOMATIC_ASSERT (false); } + DCPOMATIC_ASSERT (_audio_stream->time_base.num == 1); + frame->pts = _audio_frames * _audio_stream->time_base.den / _audio_frame_rate; + AVPacket packet; av_init_packet (&packet); packet.data = 0; @@ -405,6 +416,7 @@ FFmpegFileEncoder::audio_frame (int size) av_frame_free (&frame); _pending_audio->trim_start (size); + _audio_frames += size; } void @@ -422,5 +434,8 @@ FFmpegFileEncoder::buffer_free (void* opaque, uint8_t* data) void FFmpegFileEncoder::buffer_free2 (uint8_t* data) { - _pending_images.erase (data); + boost::mutex::scoped_lock lm (_pending_images_mutex); + if (_pending_images.find(data) != _pending_images.end()) { + _pending_images.erase (data); + } }