41#define RGB_LINECACHE 4
113 uint64_t x = *(
const uint64_t *)
a, y = *(
const uint64_t *)
b;
114 return (x < y) - (x > y);
182 AVFrame *enc_in, VkImageView *enc_in_views,
183 FFVkBuffer *slice_data_buf, uint32_t slice_data_size,
194 0, slice_data_size*
f->slice_count,
195 VK_FORMAT_UNDEFINED);
197 enc_in, enc_in_views,
199 VK_IMAGE_LAYOUT_GENERAL,
204 VK_SHADER_STAGE_COMPUTE_BIT,
213 AVFrame *enc_in, VkImageView *enc_in_views,
223 enc_in, enc_in_views,
225 VK_IMAGE_LAYOUT_GENERAL,
230 0, fltmap_size*
f->slice_count,
231 VK_FORMAT_UNDEFINED);
235 VK_SHADER_STAGE_COMPUTE_BIT,
244 AVFrame *enc_in, VkImageView *enc_in_views,
254 enc_in, enc_in_views,
256 VK_IMAGE_LAYOUT_GENERAL,
261 0, units_size*
f->slice_count,
262 VK_FORMAT_UNDEFINED);
266 VK_SHADER_STAGE_COMPUTE_BIT,
287 uint32_t plane_state_size;
288 uint32_t slice_state_size;
289 uint32_t slice_data_size;
293 uint32_t remap_data_size = 0;
300 int has_inter = avctx->
gop_size > 1;
301 uint32_t context_count =
f->context_count[
f->context_model];
303 VkImageMemoryBarrier2 img_bar[37];
305 VkBufferMemoryBarrier2 buf_bar[8];
314 f->cur_enc_frame = pict;
323 f->slice_count =
f->max_slice_count;
327 plane_state_size = 8;
331 plane_state_size *= context_count;
332 slice_state_size = plane_state_size*
f->plane_count;
334 slice_data_size = 256;
335 slice_state_size += slice_data_size;
336 slice_state_size =
FFALIGN(slice_state_size, 8);
341 if (!slice_data_buf) {
344 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
345 NULL, slice_state_size*
f->slice_count,
346 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
359 remap_data_size = 4*(1 <<
desc->comp[0].depth)*
sizeof(uint32_t);
364 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
365 NULL, remap_data_size*
f->slice_count,
366 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
376 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
377 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
379 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
385 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
387 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
411 .slice_data = out_data_buf->
address,
416 .plane_state_size = plane_state_size,
417 .key_frame =
f->key_frame,
419 .micro_version =
f->micro_version,
427 .slice_size_max = (out_data_buf->
size /
f->slice_count) & ~(
size_t)15,
431 for (
int i = 0;
i <
f->quant_table_count;
i++) {
434 f->quant_tables[
i][4][127];
441 memcpy(pd.
fmt_lut, (
int [4]) { 2, 1, 0, 3 }, 4*
sizeof(
int));
456 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
457 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
460 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
461 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
466 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT);
473 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
474 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
475 VK_ACCESS_SHADER_READ_BIT,
476 VK_IMAGE_LAYOUT_GENERAL,
477 VK_QUEUE_FAMILY_IGNORED);
479 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
480 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
481 .pImageMemoryBarriers = img_bar,
482 .imageMemoryBarrierCount = nb_img_bar,
490 slice_data_buf, slice_data_size, &pd));
494 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
495 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
496 0, slice_data_size*
f->slice_count);
502 remap_data_buf, remap_data_size, &pd));
505 remap_data_buf, remap_data_size, &pd));
510 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
511 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
512 0, remap_data_size*
f->slice_count);
516 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
517 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
518 .pBufferMemoryBarriers = buf_bar,
519 .bufferMemoryBarrierCount = nb_buf_bar,
528 0, slice_data_size*
f->slice_count,
529 VK_FORMAT_UNDEFINED);
533 f->remap_mode ? remap_data_buf : slice_data_buf,
535 VK_FORMAT_UNDEFINED);
539 VK_SHADER_STAGE_COMPUTE_BIT,
547 vkf->
layout[0] = VK_IMAGE_LAYOUT_UNDEFINED;
548 vkf->
access[0] = VK_ACCESS_2_NONE;
555 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
556 VK_PIPELINE_STAGE_2_CLEAR_BIT,
557 VK_ACCESS_2_TRANSFER_WRITE_BIT,
558 VK_IMAGE_LAYOUT_GENERAL,
559 VK_QUEUE_FAMILY_IGNORED);
560 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
561 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
562 .pImageMemoryBarriers = img_bar,
563 .imageMemoryBarrierCount = nb_img_bar,
567 vk->CmdClearColorImage(exec->
buf, vkf->
img[0], VK_IMAGE_LAYOUT_GENERAL,
568 &((VkClearColorValue) { 0 }),
569 1, &((VkImageSubresourceRange) {
570 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
581 0, slice_data_size*
f->slice_count,
582 VK_FORMAT_UNDEFINED);
588 VK_FORMAT_UNDEFINED);
592 VK_SHADER_STAGE_COMPUTE_BIT,
601 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
602 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
603 0, slice_data_size*
f->slice_count);
609 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
610 COMPUTE_SHADER_BIT, SHADER_READ_BIT, NONE_KHR,
611 0, remap_data_size*
f->slice_count);
614 COMPUTE_SHADER_BIT, SHADER_WRITE_BIT, NONE_KHR,
615 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
616 slice_data_size*
f->slice_count, VK_WHOLE_SIZE);
619 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
620 COMPUTE_SHADER_BIT, SHADER_READ_BIT, SHADER_WRITE_BIT,
621 slice_data_size*
f->slice_count, VK_WHOLE_SIZE);
624 fv->
optimize_rct ? VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT :
625 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
626 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
627 VK_ACCESS_SHADER_READ_BIT,
628 VK_IMAGE_LAYOUT_GENERAL,
629 VK_QUEUE_FAMILY_IGNORED);
633 VK_PIPELINE_STAGE_2_CLEAR_BIT,
634 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
635 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
636 VK_IMAGE_LAYOUT_GENERAL,
637 VK_QUEUE_FAMILY_IGNORED);
639 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
640 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
641 .pImageMemoryBarriers = img_bar,
642 .imageMemoryBarrierCount = nb_img_bar,
643 .pBufferMemoryBarriers = buf_bar,
644 .bufferMemoryBarrierCount = nb_buf_bar,
653 0, slice_data_size*
f->slice_count,
654 VK_FORMAT_UNDEFINED);
658 fd->
idx*(
f->max_slice_count + 1)*
sizeof(uint32_t),
659 f->slice_count*
sizeof(uint32_t),
660 VK_FORMAT_UNDEFINED);
666 VK_FORMAT_UNDEFINED);
670 VK_IMAGE_LAYOUT_GENERAL,
676 VK_IMAGE_LAYOUT_GENERAL,
682 0, remap_data_size*
f->slice_count,
683 VK_FORMAT_UNDEFINED);
690 size_t order_off = fd->
idx*
f->max_slice_count*
sizeof(uint32_t);
692 for (
int i = 0;
i <
f->slice_count;
i++)
696 for (
int i = 0;
i <
f->slice_count;
i++)
697 dst[
i] = UINT32_MAX - (uint32_t)order[
i];
698 if (!(fv->
order_buf.
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
699 VkMappedMemoryRange flush_data = {
700 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
703 .size = VK_WHOLE_SIZE,
705 vk->FlushMappedMemoryRanges(fv->
s.
hwctx->
act_dev, 1, &flush_data);
710 order_off,
f->slice_count*
sizeof(uint32_t),
711 VK_FORMAT_UNDEFINED);
716 VK_SHADER_STAGE_COMPUTE_BIT,
725 out_data_buf, (out_data_buf->
size /
f->slice_count) & ~(
size_t)15,
726 compacted_buf, 0, 0));
772 size_t res_off = fd->
idx*(
f->max_slice_count + 1)*
sizeof(uint32_t);
773 size_t total_off = res_off +
f->slice_count*
sizeof(uint32_t);
775 VkMappedMemoryRange invalidate_data = {
776 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
779 .size = VK_WHOLE_SIZE,
782 1, &invalidate_data);
787 f->slice_count*
sizeof(uint32_t));
794 if (!(compacted_buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
795 VkMappedMemoryRange invalidate_data = {
796 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
797 .memory = compacted_buf->
mem,
799 .size = VK_WHOLE_SIZE,
802 1, &invalidate_data);
857 vk_frames = frames_ctx->
hwctx;
858 vk_frames->
tiling = VK_IMAGE_TILING_OPTIMAL;
859 vk_frames->
usage = VK_IMAGE_USAGE_STORAGE_BIT |
860 VK_IMAGE_USAGE_TRANSFER_DST_BIT;
861 vk_frames->
img_flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
881 (uint32_t []) { 32, 32, 1 }, 0);
884 VK_SHADER_STAGE_COMPUTE_BIT);
888 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
889 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
896 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
897 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
900 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
901 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
924 fv->
s.
props.properties.limits.maxComputeWorkGroupSize[0]);
926 (uint32_t []) { wg_x, 1, 1 }, 0);
929 VK_SHADER_STAGE_COMPUTE_BIT);
933 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
934 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
941 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
942 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
945 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
946 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
950 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
951 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
973 (uint32_t []) { 32, 32, 1 }, 0);
976 VK_SHADER_STAGE_COMPUTE_BIT);
980 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
981 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
988 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
989 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
992 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
993 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
997 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
998 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1020 (uint32_t []) { 1, 1, 1 }, 0);
1023 VK_SHADER_STAGE_COMPUTE_BIT);
1027 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1028 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1035 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1036 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1039 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1040 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1061 int wg_dim =
FFMIN(fv->
s.
props.properties.limits.maxComputeWorkGroupSize[0], 1024);
1064 (uint32_t []) { wg_dim, 1, 1 }, 0);
1067 VK_SHADER_STAGE_COMPUTE_BIT);
1071 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1072 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1079 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1080 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1083 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1084 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1111 uint32_t subgroup_size;
1118 VK_SHADER_STAGE_COMPUTE_BIT);
1122 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1123 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1126 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1127 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1130 .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
1131 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1138 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1139 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1142 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1143 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1146 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1147 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1150 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1151 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1155 .type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
1156 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1159 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1160 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1163 .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
1164 .stages = VK_SHADER_STAGE_COMPUTE_BIT,
1178 }
else if (
f->remap_mode) {
1232 f->version =
f->bayer ? 4 : 3;
1239 if (
f->bits_per_raw_sample > (
f->version > 3 ? 16 : 8)) {
1242 "forcing range coder\n");
1247 if (
f->version < 4 && avctx->
gop_size > 1) {
1258 if (
f->version == 4)
1259 f->micro_version =
f->bayer ? 10 : (
f->remap_mode ? 9 : 3);
1264 if (
f->num_h_slices <= 0 &&
f->num_v_slices <= 0) {
1270 f->num_h_slices = 32;
1271 f->num_v_slices = 32;
1273 }
else if (
f->num_h_slices &&
f->num_v_slices <= 0) {
1275 }
else if (
f->num_v_slices &&
f->num_h_slices <= 0) {
1279 f->num_h_slices =
FFMIN(
f->num_h_slices, avctx->
width);
1284 "by the standard is %i\n",
1289 f->max_slice_count =
f->num_h_slices *
f->num_v_slices;
1294 if (
f->version < 4) {
1295 if (((
f->chroma_h_shift > 0) && (avctx->
width % (64 <<
f->chroma_h_shift))) ||
1296 ((
f->chroma_v_shift > 0) && (avctx->
height % (64 <<
f->chroma_v_shift)))) {
1298 "dimensions is only supported in version 4 (-level 4)\n");
1304 if (
f->version < 4) {
1325 if (maxsize > fv->
s.
props_11.maxMemoryAllocationSize) {
1327 "than maximum device allocation (%"PRIu64
"), clipping\n",
1328 maxsize, fv->
s.
props_11.maxMemoryAllocationSize);
1329 maxsize = fv->
s.
props_11.maxMemoryAllocationSize;
1332 av_log(avctx,
AV_LOG_INFO,
"Async buffers: %zuMiB per context, %zuMiB total, depth: %i\n",
1333 2*maxsize / (1024*1024),
1355 uint32_t mw = (avctx->
width +
f->num_h_slices - 1) /
f->num_h_slices;
1356 uint32_t
mh = (avctx->
height +
f->num_v_slices - 1) /
f->num_v_slices;
1359 uint32_t pn = mw*
mh;
1392 if (
f->remap_mode) {
1432 &fv->
setup, 0, 0, 0,
1434 256*
sizeof(uint32_t), 512*
sizeof(uint8_t),
1435 VK_FORMAT_UNDEFINED));
1441 256*
sizeof(uint32_t), 512*
sizeof(uint8_t),
1442 VK_FORMAT_UNDEFINED));
1446 256*
sizeof(uint32_t) + 512*
sizeof(uint8_t),
1450 VK_FORMAT_UNDEFINED));
1454 0, 256*
sizeof(uint32_t),
1455 VK_FORMAT_UNDEFINED));
1472 fv->
async_depth*(
f->max_slice_count + 1)*
sizeof(uint32_t),
1474 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
1475 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
1476 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
1482 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
1483 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
1484 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
1534#define OFFSET(x) offsetof(VulkanEncodeFFv1Context, x)
1535#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
1538 { .i64 = -1 }, -1, 2,
VE },
1540 { .i64 = 2 }, 0, 2,
VE },
1550 { .i64 = -1 }, -1, 2,
VE , .unit =
"qtable"},
1554 { .i64 =
QTABLE_8BIT }, INT_MIN, INT_MAX,
VE, .unit =
"qtable" },
1564 { .i64 = 0 }, 0, 1,
VE },
1566 {
"rct_search",
"Run a search for RCT parameters (level 4 only)",
OFFSET(optimize_rct),
AV_OPT_TYPE_BOOL,
1567 { .i64 = 1 }, 0, 1,
VE },
1570 { .i64 = 2 }, 1, INT_MAX,
VE },
1573 { .i64 = -1 }, -1, 2,
VE, .unit =
"remap_mode" },
1575 { .i64 = -1 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1577 { .i64 = 0 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1579 { .i64 = 1 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1581 { .i64 = 2 }, INT_MIN, INT_MAX,
VE, .unit =
"remap_mode" },
1592 .class_name =
"ffv1_vulkan",
1604 .p.name =
"ffv1_vulkan",
1623 .p.wrapper_name =
"vulkan",
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
const FFCodec ff_ffv1_vulkan_encoder
static AVFormatContext * ctx
Libavcodec external API header.
#define i(width, name, range_min, range_max)
#define CODEC_PIXFMTS(...)
#define FF_CODEC_RECEIVE_PACKET_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
int(* init)(AVBSFContext *ctx)
av_cold int ff_ffv1_common_init(AVCodecContext *avctx, FFV1Context *s)
FF Video Codec 1 (a lossless codec)
#define MAX_QUANT_TABLE_SIZE
#define AC_RANGE_DEFAULT_TAB_FORCE
#define AC_RANGE_CUSTOM_TAB
#define MAX_CONTEXT_INPUTS
int ff_ffv1_vk_init_consts(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f)
uint32_t ff_ffv1_vk_rc_lanes(const FFVulkanContext *s, uint32_t *required)
Number of invocations that range code a slice together, as a single subgroup.
void ff_ffv1_vk_set_common_sl(AVCodecContext *avctx, FFV1Context *f, VkSpecializationInfo *sl, enum AVPixelFormat sw_format)
int ff_ffv1_encode_determine_slices(AVCodecContext *avctx)
av_cold int ff_ffv1_encode_init(AVCodecContext *avctx)
size_t ff_ffv1_encode_buffer_size(AVCodecContext *avctx)
av_cold int ff_ffv1_encode_setup_plane_info(AVCodecContext *avctx, enum AVPixelFormat pix_fmt)
av_cold int ff_ffv1_write_extradata(AVCodecContext *avctx)
static int run_remap(AVCodecContext *avctx, FFVkExecContext *exec, AVFrame *enc_in, VkImageView *enc_in_views, FFVkBuffer *fltmap_buf, uint32_t fltmap_size, FFv1ShaderParams *pd)
static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx, FFVkExecContext *exec, AVFrame *pict)
const char * ff_source_ffv1_enc_comp
const unsigned char ff_ffv1_enc_reset_comp_spv_data[]
static const FFCodecDefault vulkan_encode_ffv1_defaults[]
const unsigned int ff_ffv1_enc_sort32_comp_spv_len
static int init_reset_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
static int cmp_slice_order(const void *a, const void *b)
static int get_packet(AVCodecContext *avctx, FFVkExecContext *exec, AVPacket *pkt)
const char * ff_source_rangecoder_comp
const unsigned int ff_ffv1_enc_bayer_comp_spv_len
static int init_sort32_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
static const AVOption vulkan_encode_ffv1_options[]
const char * ff_source_ffv1_common_comp
const unsigned char ff_ffv1_enc_reset_golomb_comp_spv_data[]
const unsigned int ff_ffv1_enc_bayer_golomb_comp_spv_len
const unsigned char ff_ffv1_enc_bayer_comp_spv_data[]
static int init_rct_search_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
static size_t ffv1_vk_buffer_size(AVCodecContext *avctx)
static int init_remap_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
static int run_sort32(AVCodecContext *avctx, FFVkExecContext *exec, AVFrame *enc_in, VkImageView *enc_in_views, FFVkBuffer *units_buf, uint32_t units_size, FFv1ShaderParams *pd)
const unsigned int ff_ffv1_enc_reset_comp_spv_len
const unsigned int ff_ffv1_enc_rct_search_comp_spv_len
const unsigned char ff_ffv1_enc_rgb_golomb_comp_spv_data[]
const unsigned int ff_ffv1_enc_rgb_golomb_comp_spv_len
const unsigned int ff_ffv1_enc_remap_comp_spv_len
const char * ff_source_ffv1_vlc_comp
static void ffv1_vk_packet_free(void *opaque, uint8_t *data)
static av_cold int vulkan_encode_ffv1_init(AVCodecContext *avctx)
static int init_encode_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
const unsigned char ff_ffv1_enc_bayer_golomb_comp_spv_data[]
static int init_setup_shader(AVCodecContext *avctx, VkSpecializationInfo *sl)
const unsigned int ff_ffv1_enc_golomb_comp_spv_len
static av_cold int vulkan_encode_ffv1_close(AVCodecContext *avctx)
const unsigned int ff_ffv1_enc_setup_comp_spv_len
const unsigned char ff_ffv1_enc_setup_comp_spv_data[]
const unsigned int ff_ffv1_enc_rgb_float_comp_spv_len
const unsigned char ff_ffv1_enc_remap_comp_spv_data[]
const unsigned int ff_ffv1_enc_comp_spv_len
const unsigned int ff_ffv1_enc_rgb_comp_spv_len
static av_cold void vulkan_encode_ffv1_flush(AVCodecContext *avctx)
const AVCodecHWConfigInternal *const vulkan_encode_ffv1_hw_configs[]
const unsigned int ff_ffv1_enc_reset_golomb_comp_spv_len
const unsigned char ff_ffv1_enc_rgb_float_golomb_comp_spv_data[]
static int vulkan_encode_ffv1_receive_packet(AVCodecContext *avctx, AVPacket *pkt)
static const AVClass vulkan_encode_ffv1_class
const unsigned char ff_ffv1_enc_sort32_comp_spv_data[]
const unsigned char ff_ffv1_enc_rgb_comp_spv_data[]
const unsigned char ff_ffv1_enc_golomb_comp_spv_data[]
const unsigned char ff_ffv1_enc_rgb_float_comp_spv_data[]
static int init_indirect(AVCodecContext *avctx, enum AVPixelFormat sw_format)
const unsigned int ff_ffv1_enc_rgb_float_golomb_comp_spv_len
static int run_rct_search(AVCodecContext *avctx, FFVkExecContext *exec, AVFrame *enc_in, VkImageView *enc_in_views, FFVkBuffer *slice_data_buf, uint32_t slice_data_size, FFv1ShaderParams *pd)
const unsigned char ff_ffv1_enc_comp_spv_data[]
const unsigned char ff_ffv1_enc_rct_search_comp_spv_data[]
const char * ff_source_common_comp
#define AV_NUM_DATA_POINTERS
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
#define AV_CODEC_CAP_ENCODER_FLUSH
This encoder can be flushed using avcodec_flush_buffers().
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_CODEC_CAP_HARDWARE
Codec is backed by a hardware implementation.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
#define LIBAVUTIL_VERSION_INT
#define HW_CONFIG_ENCODER_FRAMES(format, device_type_)
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
int av_hwframe_get_buffer(AVBufferRef *hwframe_ref, AVFrame *frame, int flags)
Allocate a new frame attached to the given AVHWFramesContext.
common internal api header.
void ff_vk_set_perm(enum AVPixelFormat pix_fmt, int lut[4], int inv)
Since storage images may not be swizzled, we have to do this in the shader itself.
void ff_vk_shader_update_img_array(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, AVFrame *f, VkImageView *views, int set, int binding, VkImageLayout layout, VkSampler sampler)
Update a descriptor in a buffer with an image array.
int ff_vk_shader_load(FFVulkanShader *shd, VkPipelineStageFlags stage, VkSpecializationInfo *spec, uint32_t wg_size[3], uint32_t required_subgroup_size)
Initialize a shader object.
void ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, const FFVulkanDescriptorSetBinding *desc, int nb, int singular)
Add descriptor to a shader.
void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool)
int ff_vk_create_buf(FFVulkanContext *s, FFVkBuffer *buf, size_t size, void *pNext, void *alloc_pNext, VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags)
int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *qf, FFVkExecPool *pool, int nb_contexts, int nb_queries, VkQueryType query_type, int query_64bit, const void *query_create_pnext)
Allocates/frees an execution pool.
void ff_vk_exec_wait(FFVulkanContext *s, FFVkExecContext *e)
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
void ff_vk_uninit(FFVulkanContext *s)
Frees main context.
int ff_vk_init(FFVulkanContext *s, void *log_parent, AVBufferRef *device_ref, AVBufferRef *frames_ref)
Initializes the AVClass, in case this context is not used as the main user's context.
void ff_vk_free_buf(FFVulkanContext *s, FFVkBuffer *buf)
void ff_vk_frame_barrier(FFVulkanContext *s, FFVkExecContext *e, AVFrame *pic, VkImageMemoryBarrier2 *bar, int *nb_bar, VkPipelineStageFlags2 src_stage, VkPipelineStageFlags2 dst_stage, VkAccessFlagBits2 new_access, VkImageLayout new_layout, uint32_t new_qf)
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e, VkImageView views[AV_NUM_DATA_POINTERS], AVFrame *f, enum FFVkShaderRepFormat rep_fmt)
Create an imageview and add it as a dependency to an execution.
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Register a shader with an exec pool.
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, const FFVulkanShader *shd)
Bind a shader.
void ff_vk_exec_move_dep_refstruct(FFVulkanContext *s, FFVkExecContext *e, void *obj)
int ff_vk_shader_update_desc_buffer(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, int set, int bind, int elem, FFVkBuffer *buf, VkDeviceSize offset, VkDeviceSize len, VkFormat fmt)
Update a descriptor in a buffer with a buffer.
AVVulkanDeviceQueueFamily * ff_vk_qf_find(FFVulkanContext *s, VkQueueFlagBits dev_family, VkVideoCodecOperationFlagBitsKHR vid_ops)
Chooses an appropriate QF.
void ff_vk_exec_add_dep_refstruct(FFVulkanContext *s, FFVkExecContext *e, void *obj)
Execution dependency management.
int ff_vk_get_pooled_buffer(FFVulkanContext *ctx, AVRefStructPool **buf_pool, FFVkBuffer **buf, VkBufferUsageFlags usage, void *create_pNext, size_t size, VkMemoryPropertyFlagBits mem_props)
Initialize a pool and create AVBufferRefs containing FFVkBuffer.
void ff_vk_exec_discard(FFVulkanContext *s, FFVkExecContext *e)
int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader *shd, const char *spirv, size_t spirv_len, const char *entrypoint)
Link a shader into an executable.
int ff_vk_exec_add_dep_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkPipelineStageFlagBits2 wait_stage, VkPipelineStageFlagBits2 signal_stage)
void ff_vk_shader_update_push_const(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, VkShaderStageFlagBits stage, int offset, size_t size, void *src)
Update push constant in a shader.
void ff_vk_exec_add_dep_wait_sem(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore sem, uint64_t val, VkPipelineStageFlagBits2 stage)
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_RGBA128
#define AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_GBRP12
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
#define AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_GBRAPF32
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
void * av_refstruct_ref(void *obj)
Create a new reference to an object managed via this API, i.e.
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
A reference to a data buffer.
uint8_t * data
The data buffer.
Describe the class of an AVClass context structure.
main external API structure.
int width
picture width / height.
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames.
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
int slices
Number of slices.
This structure describes decoded (raw) audio or video data.
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
This struct describes a set or pool of "hardware" frames (i.e.
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
void * hwctx
The format-specific data, allocated and freed automatically along with this context.
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
int width
The allocated dimensions of the frames in this pool.
This structure stores compressed data.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
AVRefStructPool is an API for a thread-safe pool of objects managed via the RefStruct API.
VkImageLayout layout[AV_NUM_DATA_POINTERS]
VkAccessFlagBits2 access[AV_NUM_DATA_POINTERS]
Updated after every barrier.
VkImage img[AV_NUM_DATA_POINTERS]
Vulkan images to which the memory is bound to.
VkDevice act_dev
Active device.
Allocated as AVHWFramesContext.hwctx, used to set pool-specific options.
VkImageTiling tiling
Controls the tiling of allocated frames.
VkImageCreateFlags img_flags
Flags to set during image creation.
VkImageUsageFlagBits usage
Defines extra usage of output frames.
int ac
1=range coder <-> 0=golomb rice
VkMemoryPropertyFlagBits flags
Frame loop for compute encoders.
FFVkExecContext * contexts
AVHWFramesContext * frames
AVVulkanDeviceContext * hwctx
VkMemoryPropertyFlagBits host_cached_flag
VkPhysicalDeviceVulkan11Properties props_11
VkPhysicalDeviceProperties2 props
uint16_t context_count[8]
uint32_t extend_lookup[8]
uint32_t prev_size[MAX_SLICES]
AVRefStructPool * remap_data_pool
uint32_t max_pixels_per_slice
FFVkBuffer * keyframe_slice_data_ref
AVRefStructPool * out_data_pool
AVRefStructPool * compacted_data_pool
AVRefStructPool * slice_data_pool
FFVulkanShader rct_search
AVVulkanDeviceQueueFamily * qf
AVBufferRef * intermediate_frames_ref
VulkanEncodeFFv1FrameData * exec_ctx_info
FFVkBuffer * out_data_ref
FFVkBuffer * compacted_data_ref
#define ff_vk_buf_barrier(dst, vkb, s_stage, s_access, s_access2, d_stage, d_access, d_access2, offs, bsz)
#define SPEC_LIST_ADD(name, idx, val_bits, val)
#define SPEC_LIST_CREATE(name, max_length, max_size)
static int ff_vk_map_buffer(FFVulkanContext *s, FFVkBuffer *buf, uint8_t **mem, int invalidate)
int ff_vk_encode_loop_receive_packet(AVCodecContext *avctx, FFVkEncodeLoop *l, AVPacket *pkt)
Call from FFCodec.cb.receive_packet; the packet metadata is carried from the submitted frame to its p...
void ff_vk_encode_loop_uninit(FFVkEncodeLoop *l)
void ff_vk_encode_loop_flush(AVCodecContext *avctx, FFVkEncodeLoop *l)
Waits for and discards every frame in flight.
int ff_vk_encode_loop_init(FFVulkanContext *s, FFVkExecPool *pool, FFVkEncodeLoop *l, int(*submit_frame)(AVCodecContext *avctx, FFVkExecContext *exec, AVFrame *frame), int(*get_packet)(AVCodecContext *avctx, FFVkExecContext *exec, AVPacket *pkt))
int ff_vk_seg_gather_init(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Packs fixed-stride segment slots back to back into a contiguous buffer.
int ff_vk_seg_gather(FFVulkanContext *s, FFVkExecContext *exec, FFVulkanShader *shd, FFVkBuffer *sizes, size_t sizes_offset, uint32_t nb_segs, FFVkBuffer *sparse, uint32_t slot_size, FFVkBuffer *compacted, size_t compacted_offset, VkDeviceAddress offset_addr)
Gathers nb_segs slots of slot_size bytes from sparse into compacted, with the segment sizes given as ...