X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_encoder.cc;h=f82290c6cd2f1183edb71063fd18337940ebddce;hb=df17bbd25da69fc38eb2dcd8b4a2531cf0bab0bc;hp=c96f1b5e554c1005cb455d54f61d244e8d28862e;hpb=d66bcea066deb3b3cd919a69aab7e2078fb52ca8;p=dcpomatic.git diff --git a/src/lib/ffmpeg_encoder.cc b/src/lib/ffmpeg_encoder.cc index c96f1b5e5..f82290c6c 100644 --- a/src/lib/ffmpeg_encoder.cc +++ b/src/lib/ffmpeg_encoder.cc @@ -72,7 +72,7 @@ FFmpegEncoder::FFmpegEncoder (shared_ptr film, weak_ptr job, bo break; } - _player->set_always_burn_subtitles (true); + _player->set_always_burn_open_captions (); _player->set_play_referenced (); int const ch = film->audio_channels (); @@ -123,7 +123,7 @@ FFmpegEncoder::setup_video () _video_codec_context->height = _film->frame_size().height; _video_codec_context->time_base = (AVRational) { 1, _film->video_frame_rate() }; _video_codec_context->pix_fmt = _pixel_format; - _video_codec_context->flags |= CODEC_FLAG_QSCALE | CODEC_FLAG_GLOBAL_HEADER; + _video_codec_context->flags |= AV_CODEC_FLAG_QSCALE | AV_CODEC_FLAG_GLOBAL_HEADER; } void @@ -211,12 +211,12 @@ FFmpegEncoder::go () _butler->get_audio (interleaved, audio_frames); /* XXX: inefficient; butler interleaves and we deinterleave again */ float* p = interleaved; - for (int i = 0; i < audio_frames; ++i) { - for (int j = 0; j < _output_audio_channels; ++j) { - deinterleaved->data(j)[i] = *p++; + for (int j = 0; j < audio_frames; ++j) { + for (int k = 0; k < _output_audio_channels; ++k) { + deinterleaved->data(k)[j] = *p++; } } - audio (deinterleaved, i); + audio (deinterleaved); } delete[] interleaved; @@ -280,12 +280,9 @@ FFmpegEncoder::video (shared_ptr video, DCPTime time) AVFrame* frame = av_frame_alloc (); DCPOMATIC_ASSERT (frame); + _pending_images[image->data()[0]] = image; for (int i = 0; i < 3; ++i) { - size_t const size = image->stride()[i] * image->sample_size(i).height; - AVBufferRef* buffer = av_buffer_alloc (size); - DCPOMATIC_ASSERT (buffer); - /* XXX: inefficient */ - memcpy (buffer->data, image->data()[i], size); + 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); frame->data[i] = buffer->data; frame->linesize[i] = image->stride()[i]; @@ -330,14 +327,14 @@ FFmpegEncoder::video (shared_ptr video, DCPTime time) /** Called when the player gives us some audio */ void -FFmpegEncoder::audio (shared_ptr audio, DCPTime) +FFmpegEncoder::audio (shared_ptr audio) { _pending_audio->append (audio); int frame_size = _audio_codec_context->frame_size; if (frame_size == 0) { /* codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE */ - frame_size = 2000; + frame_size = _film->audio_frame_rate() / _film->video_frame_rate(); } while (_pending_audio->frames() >= frame_size) { @@ -414,7 +411,7 @@ FFmpegEncoder::audio_frame (int size) } void -FFmpegEncoder::subtitle (PlayerSubtitles, DCPTimePeriod) +FFmpegEncoder::subtitle (PlayerText, DCPTimePeriod) { } @@ -431,3 +428,15 @@ FFmpegEncoder::frames_done () const boost::mutex::scoped_lock lm (_mutex); return _last_time.frames_round (_film->video_frame_rate ()); } + +void +FFmpegEncoder::buffer_free (void* opaque, uint8_t* data) +{ + reinterpret_cast(opaque)->buffer_free2(data); +} + +void +FFmpegEncoder::buffer_free2 (uint8_t* data) +{ + _pending_images.erase (data); +}