[Libav-user] [dnxhd] Internal error, put_bits buffer too small
Jonathan Noble
jonnobleuk at gmail.com
Thu Oct 3 23:14:37 EEST 2019
I discovered what the issue was after commenting out sections of code until
behaviour change.
AVFormatContext->thread_count was set but AVFormatContext->thread_type
wasn't. Either unsetting thread_count or setting thread_type fixed the
issue for me.
On Thu, 3 Oct 2019 at 20:35, Jonathan Noble <jonnobleuk at gmail.com> wrote:
> I've just searched for any instance of AVCodecContext->frame_size and it
> is only read.
>
> Here is a sample of how the AVCodecContext is setup
>
> // setup context
>> vcodec_ctx->codec_id = static_cast<AVCodecID>(video_params_.codec);
>> vcodec_ctx->codec_type = AVMEDIA_TYPE_VIDEO;
>> vcodec_ctx->width = video_params_.width;
>> vcodec_ctx->height = video_params_.height;
>> vcodec_ctx->sample_aspect_ratio = {1, 1};
>> vcodec_ctx->pix_fmt = vcodec->pix_fmts[0]; // maybe be breakable code
>> setupFrameRate(*vcodec_ctx, video_params_.frame_rate);
>> if (video_params_.compression_type == CompressionType::CBR) {
>> const auto brate = static_cast<int64_t>((video_params_.bitrate * 1E6)
>> + 0.5);
>> vcodec_ctx->bit_rate = brate;
>> vcodec_ctx->rc_min_rate = brate;
>> vcodec_ctx->rc_max_rate = brate;
>> }
>> vcodec_ctx->time_base = av_inv_q(vcodec_ctx->framerate);
>> video_stream->time_base = vcodec_ctx->time_base;
>> vcodec_ctx->gop_size = video_params_.gop_length_;
>> vcodec_ctx->thread_count =
>> static_cast<int>(std::thread::hardware_concurrency());
>>
> // Do bare minimum before avcodec_open2
>> switch (vcodec_ctx->codec_id) {
>> case AV_CODEC_ID_H264:
>> setupH264Encoder(*vcodec_ctx, video_params_);
>> break;
>> case AV_CODEC_ID_MPEG2VIDEO:
>> setupMPEG2Encoder(*vcodec_ctx, video_params_);
>> break;
>> case AV_CODEC_ID_DNXHD:
>> setupDNXHDEncoder(*vcodec_ctx, video_params_);
>> break;
>> case AV_CODEC_ID_MPEG4:
>> setupMPEG4Encoder(*vcodec_ctx, video_params_);
>> default:
>> // Nothing defined for these codecs yet
>> break;
>> }
>>
>> auto ret = avcodec_open2(vcodec_ctx, vcodec, &opts);
>> if (ret < 0) {
>> av_strerror(ret, err.data(), ERR_LEN);
>> qCritical() << "Could not open output video encoder." << err.data();
>> ed->export_error = tr("could not open output video encoder
>> (%1)").arg(err.data());
>> return false;
>> }
>>
>> if (fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) {
>> vcodec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
>> }
>>
>> vcodec_ctx->sample_aspect_ratio = {1, 1};
>> vcodec_ctx->max_b_frames = video_params_.b_frames_;
>>
>> // copy video encoder parameters to output stream
>> ret = avcodec_parameters_from_context(video_stream->codecpar,
>> vcodec_ctx);
>> if (ret < 0) {
>> av_strerror(ret, err.data(), ERR_LEN);
>> qCritical() << "Could not copy video encoder parameters to output
>> stream, code=" << err.data();
>> ed->export_error = tr("could not copy video encoder parameters to
>> output stream (%1)").arg(QString::number(ret));
>> return false;
>> }
>>
>
> void ExportThread::setupDNXHDEncoder(AVCodecContext& ctx, const Params&
>> video_params) const
>> {
>> ctx.profile = FF_PROFILE_DNXHD;
>> // FIXME: DNXHDEncContext.pb needs setting up somehow
>>
>> if (video_params.profile_.endsWith("x")) {
>> // dnxhdenc will deduce this as 10bits
>> if (!video_params.pix_fmts_.empty())
>> {
>> auto fmt = video_params.pix_fmts_.front();
>> switch (fmt)
>> {
>> case PixelFormat::YUV444:
>> ctx.pix_fmt = AV_PIX_FMT_YUV444P10;
>> break;
>> case PixelFormat::YUV422:
>> ctx.pix_fmt = AV_PIX_FMT_YUV422P10;
>> break;
>> case PixelFormat::YUV420:
>> // this may not be in any profile
>> ctx.pix_fmt = AV_PIX_FMT_YUV420P10;
>> break;
>> }
>> }
>> }
>> }
>>
>
> On Thu, 3 Oct 2019 at 09:47, Paul B Mahol <onemda at gmail.com> wrote:
>
>> On 10/3/19, Jonathan Noble <jonnobleuk at gmail.com> wrote:
>> > It isn't reproduceable with ffmpeg. Am i in the wrong mailing-list?
>>
>> Perhaps you reset frame_size somehow?
>>
>> >
>> > On Thu, 3 Oct 2019 at 07:47, Paul B Mahol <onemda at gmail.com> wrote:
>> >
>> >> Please provide input samples that allow to reproduce this issue with
>> >> ffmpeg.
>> >>
>> >> On 10/2/19, Jonathan Noble <jonnobleuk at gmail.com> wrote:
>> >> > Hi,
>> >> >
>> >> > I am trying to encode to dnxhd with libavcodec. The result is quite
>> >> glitchy
>> >> > with stuttering and anomalies on most frames.
>> >> >
>> >> > During encoding I see the following message almost continuously.
>> >> >
>> >> >> Internal error, put_bits buffer too small
>> >> >
>> >> > I have tried to understand what this buffer is, how it is set up and
>> I
>> >> > am
>> >> > struggling. From what I can understand the puts_bit buffer is
>> >> > DNXHDEncContext->m->pb which is initialised via init_put_bits() in
>> >> > dnxhd_encode_thread().
>> >> >
>> >> > The 2 arguments used in init_put_bits() are
>> DNXHDEncContext->slice_offs
>> >> and
>> >> > DNXHDEncContext->slice_size. These 2 are configured in
>> >> > dnxhd_setup_thread_slices() with 2 variables MpegEncContext->mb_width
>> >> > and
>> >> > MpegEncContext->mb_bits.
>> >> >
>> >> > If my understanding is correct the 2 aforementioned variables in
>> >> > MpegEncContext are the variables I need to set. However, I have no
>> idea
>> >> > what they mean or how they are accessed outside of
>> >> > AVCodecContext->priv_data.
>> >> >
>> >> > Is my understanding correct? How does one setup the puts_bit buffer
>> >> > correctly for a dnxhd encode?
>> >> >
>> >> > Kind regards
>> >> >
>> >> > Jon Noble
>> >> >
>> >> _______________________________________________
>> >> Libav-user mailing list
>> >> Libav-user at ffmpeg.org
>> >> https://ffmpeg.org/mailman/listinfo/libav-user
>> >>
>> >> To unsubscribe, visit link above, or email
>> >> libav-user-request at ffmpeg.org with subject "unsubscribe".
>> >
>> _______________________________________________
>> Libav-user mailing list
>> Libav-user at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/libav-user
>>
>> To unsubscribe, visit link above, or email
>> libav-user-request at ffmpeg.org with subject "unsubscribe".
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20191003/215f6dd4/attachment.html>
More information about the Libav-user
mailing list