290 QByteArray &paletteData,
298 if (formatName.isEmpty()) {
303 AVCodecID codecId = format.
codecId();
304 if (codecId == AV_CODEC_ID_NONE) {
309 const AVOutputFormat *outputFormat = av_guess_format(formatName.toUtf8().constData(),
nullptr,
nullptr);
315 const AVCodec *codec = avcodec_find_encoder(codecId);
338 int err = avformat_alloc_output_context2(&
m_formatContext, outputFormat,
nullptr,
nullptr);
384 if (!filterDesc.isEmpty()) {
385 const AVFilter *buffersrcFilter = avfilter_get_by_name(
"buffer");
386 if (!buffersrcFilter) {
391 const AVFilter *buffersinkFilter = avfilter_get_by_name(
"buffersink");
392 if (!buffersinkFilter) {
403 if (!paletteData.isEmpty()) {
430 QByteArray buffersrcArgs =
431 QStringLiteral(
"video_size=%1x%2:pix_fmt=%3:time_base=%4/%5:pixel_aspect=%6/%7")
435 .arg(stream->time_base.num)
436 .arg(stream->time_base.den)
443 buffersrcArgs.constData(),
452 if (!paletteData.isEmpty()) {
455 QByteArray palettesrcArgs =
456 QStringLiteral(
"video_size=%1x%1:pix_fmt=%2:time_base=1/24:pixel_aspect=0/1")
458 .arg(
int(AV_PIX_FMT_BGRA))
463 palettesrcArgs.constData(),
479#if LIBAVUTIL_VERSION_MAJOR >= 60
482 unsigned int pixFmtsCount = 0;
483 for (AVPixelFormat pixFmt : pixFmts) {
484 if (pixFmt == AV_PIX_FMT_NONE) {
492 AV_OPT_SEARCH_CHILDREN | AV_OPT_ARRAY_REPLACE,
495 AV_OPT_TYPE_PIXEL_FMT,
496 pixFmts.constData());
502 AV_OPT_SEARCH_CHILDREN);
534 filterDesc.constData(),
546 QStringLiteral(
"avfilter_graph_config failed").arg(QString::fromUtf8(filterDesc)),
559 std::unique_ptr<QIODevice> output;
562 output = std::make_unique<QBuffer>(&paletteData);
563 if (!output->open(QIODevice::WriteOnly | QIODevice::Truncate)) {
565 QStringLiteral(
"failed to open palette output buffer: %1").arg(output->errorString()));
570 if (!output->open(QIODevice::WriteOnly | QIODevice::Truncate)) {
573 .arg(output->errorString()));
584 m_formatContext->pb = avio_alloc_context(
reinterpret_cast<unsigned char *
>(buffer.data()),
612 m_frame->height = outputHeight;
615 err = av_frame_get_buffer(
m_frame, 0);
663 err = av_buffersrc_add_frame_flags(
m_palettesrcContext,
nullptr, AV_BUFFERSRC_FLAG_KEEP_REF);
680 AVPixelFormat inputPixelFormat;
685 int inputWidth = inputImage.width();
686 int inputHeight = inputImage.height();
687 if (inputWidth <= 0 || inputHeight <= 0 || inputImage.isNull()) {
698 err = av_frame_make_writable(
m_frame);
709 AVPixelFormat(
m_frame->format),
716 const uint8_t *data =
reinterpret_cast<const uint8_t *
>(inputImage.constBits());
717 const int stride = inputImage.bytesPerLine();
718 sws_scale(swsContext, &data, &stride, 0, inputHeight,
m_frame->data,
m_frame->linesize);
720 for (
int i = 0; i < instances; ++i) {
758 QFile *outputFile = qobject_cast<QFile *>(output.get());
759 if (outputFile && !outputFile->flush()) {
762 .arg(outputFile->errorString()));