diff --git a/liblava/base/instance.cpp b/liblava/base/instance.cpp index e0bd2fd8e59f21ae7f227687dad62ad4ee7e6151..0e16c5b5b6bb0d16d88ef598b9b8b999844f4346 100644 --- a/liblava/base/instance.cpp +++ b/liblava/base/instance.cpp @@ -125,7 +125,7 @@ namespace lava { log()->error(str(message_header)); log()->error(callback_data->pMessage); - assert(!"check validation error"); + //assert(!"check validation error"); } else if (message_severity == VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { log()->warn(str(message_header)); log()->warn(callback_data->pMessage); diff --git a/res/dpr/utility/encode_chroma_subsampling.frag b/res/dpr/utility/encode_chroma_subsampling.frag index c2009de0a46fa5ba4695cf3f275c13695f308be6..aaf4cc7ea9d57bcba32a266e5ef39cb434c4ee54 100644 --- a/res/dpr/utility/encode_chroma_subsampling.frag +++ b/res/dpr/utility/encode_chroma_subsampling.frag @@ -6,13 +6,13 @@ layout(set = 0, binding = 0) uniform sampler2D samplerInput; void main() { - vec2 base_coord = 2.0 * floor(gl_FragCoord.xy); + ivec2 base_coord = 2 * ivec2(gl_FragCoord.xy); - vec2 color_chroma = vec2(0.0, 0.0); - color_chroma += texture(samplerInput, base_coord + vec2(0.0, 0.0)).xy; - color_chroma += texture(samplerInput, base_coord + vec2(1.0, 0.0)).xy; - color_chroma += texture(samplerInput, base_coord + vec2(0.0, 1.0)).xy; - color_chroma += texture(samplerInput, base_coord + vec2(1.0, 1.0)).xy; + vec2 color_chroma = vec2(1.0, 0.0); + color_chroma += texelFetch(samplerInput, base_coord + ivec2(0, 0), 0).xy; + color_chroma += texelFetch(samplerInput, base_coord + ivec2(1, 0), 0).xy; + color_chroma += texelFetch(samplerInput, base_coord + ivec2(0, 1), 0).xy; + color_chroma += texelFetch(samplerInput, base_coord + ivec2(1, 1), 0).xy; color_chroma /= 4.0; outChroma = color_chroma; diff --git a/res/dpr/utility/encode_color_conversion.frag b/res/dpr/utility/encode_color_conversion.frag index 46cc05b9e9d0e16d265dc34c52156ffc98ef1e99..280ad7538e41bda8aacae29c6fa69a4eb4f9ce32 100644 --- a/res/dpr/utility/encode_color_conversion.frag +++ b/res/dpr/utility/encode_color_conversion.frag @@ -15,7 +15,7 @@ void main() vec3(0.114, 0.436, -0.10001) //third column ); - vec3 color_rgb = texture(samplerInput, floor(gl_FragCoord.xy)).xyz; + vec3 color_rgb = texelFetch(samplerInput, ivec2(gl_FragCoord.xy), 0).xyz; vec3 color_yuv = convert_matrix * color_rgb; outLuma = color_yuv.x; diff --git a/src/headset/remote_headset.cpp b/src/headset/remote_headset.cpp index 7e53d384c702c8c813569f1d84469f7df300719b..883f2fda69c4990367bd1115b24d5c6e8f3845cb 100644 --- a/src/headset/remote_headset.cpp +++ b/src/headset/remote_headset.cpp @@ -102,6 +102,11 @@ void RemoteHeadset::submit_frame(VkCommandBuffer command_buffer, VkImageLayout f return; } + if (frame_id > 0) + { + return; + } + lava::renderer& renderer = this->get_application()->get_renderer(); Encoder::Ptr encoder = this->encoders[frame_id]; diff --git a/src/utility/encoder.cpp b/src/utility/encoder.cpp index cdf52a885ffd6e524ab389e5b21ded64014ae70a..528d50d7ffe7b187abd6773cc0b44fbb5656d9a8 100644 --- a/src/utility/encoder.cpp +++ b/src/utility/encoder.cpp @@ -221,13 +221,49 @@ bool Encoder::encode_frame(VkCommandBuffer command_buffer, lava::renderer& rende //Execute the subsample pass. Render a fullscreen quad and subsample the image frame->input_chroma. Store the result in the image frame->input_chroma_subsampled. vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, this->pipeline_layout->get(), 0, 1, &frame->subsample_descriptor, 0, nullptr); frame->subsample_pass->process(command_buffer, 0); - + //Check if the original layout of the input image needs to be restored. if (image_layout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { lava::insert_image_memory_barrier(device, command_buffer, image->get(), VK_ACCESS_SHADER_READ_BIT, 0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, image_layout, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, image->get_subresource_range()); } + /*VkImageMemoryBarrier image_barrier; + image_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + image_barrier.pNext = nullptr; + image_barrier.srcAccessMask = 0; + image_barrier.dstAccessMask = 0; + image_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; + image_barrier.newLayout = VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR; + image_barrier.srcQueueFamilyIndex = this->default_queue.family; + image_barrier.dstQueueFamilyIndex = this->encode_queue->family; + image_barrier.image = frame->input_combined; + image_barrier.subresourceRange = image_range; + + vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_barrier); + */ + /* + //DEBUG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + VkImageSubresourceRange image_range; + image_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + image_range.baseMipLevel = 0; + image_range.levelCount = 1; + image_range.baseArrayLayer = 0; + image_range.layerCount = 1; + + VkClearColorValue clear_value; + clear_value.float32[0] = 1.0f; + clear_value.float32[1] = 0.0f; + clear_value.float32[2] = 0.0f; + clear_value.float32[3] = 0.0f; + + lava::insert_image_memory_barrier(this->descriptor_pool->get_device(), command_buffer, frame->input_luma, 0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, image_range); + lava::insert_image_memory_barrier(this->descriptor_pool->get_device(), command_buffer, frame->input_chroma_subsampled, 0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, image_range); + + vkCmdClearColorImage(command_buffer, frame->input_luma, VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1, &image_range); + vkCmdClearColorImage(command_buffer, frame->input_chroma_subsampled, VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1, &image_range); + */ VkImageSubresourceRange image_range; image_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; image_range.baseMipLevel = 0; @@ -242,13 +278,16 @@ bool Encoder::encode_frame(VkCommandBuffer command_buffer, lava::renderer& rende image_barrier.dstAccessMask = 0; image_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; image_barrier.newLayout = VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR; - image_barrier.srcQueueFamilyIndex = this->default_queue.family; - image_barrier.dstQueueFamilyIndex = this->encode_queue->family; + image_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; //this->default_queue.family; + image_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; //this->encode_queue->family; image_barrier.image = frame->input_combined; image_barrier.subresourceRange = image_range; vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &image_barrier); - + + //DEBUG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + //Create the encode command buffer. if (!this->record_encoding(device, frame, false)) { @@ -393,9 +432,10 @@ bool Encoder::record_encoding(lava::device_ptr device, EncoderFrame::Ptr frame, void Encoder::retrive_encoding(lava::device_ptr device, EncoderFrame::Ptr frame) { - std::array<uint32_t, 3> buffer_range; //NOTE: For some reasons, outputs 3 values instead of 2. + std::array<uint32_t, 3> buffer_range; + memset(buffer_range.data(), 0, sizeof(uint32_t) * buffer_range.size()); - if (vkGetQueryPoolResults(device->get(), this->query_pool, frame->output_query_index, 1, sizeof(uint32_t) * buffer_range.size(), buffer_range.data(), 0, VK_QUERY_RESULT_WAIT_BIT) != VK_SUCCESS) + if (vkGetQueryPoolResults(device->get(), this->query_pool, frame->output_query_index, 1, sizeof(uint32_t) * buffer_range.size(), buffer_range.data(), 0, VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_WITH_STATUS_BIT_KHR) != VK_SUCCESS) { return; } @@ -506,20 +546,20 @@ bool Encoder::create_parameters(lava::device_ptr device) sps_flags.constraint_set3_flag = 0; // No constraints sps_flags.constraint_set4_flag = 0; // No constraints sps_flags.constraint_set5_flag = 0; // No constraints - sps_flags.direct_8x8_inference_flag = 0; // Not Required, only for b-frames + sps_flags.direct_8x8_inference_flag = 1; // Not Required, only for b-frames sps_flags.mb_adaptive_frame_field_flag = 0; // Not Required sps_flags.frame_mbs_only_flag = 1; // Only frames no fields sps_flags.delta_pic_order_always_zero_flag = 0; // Not Required sps_flags.separate_colour_plane_flag = 0; // Not Required sps_flags.gaps_in_frame_num_value_allowed_flag = 0; // No gaps allowed sps_flags.qpprime_y_zero_transform_bypass_flag = 0; // Not Required - sps_flags.frame_cropping_flag = 1; // Use crop to adjust the image size + sps_flags.frame_cropping_flag = 0; // Use crop to adjust the image size sps_flags.seq_scaling_matrix_present_flag = 0; // Not Required sps_flags.vui_parameters_present_flag = 0; // Dont send VUI StdVideoH264SequenceParameterSet sps_parameter; - sps_parameter.profile_idc = STD_VIDEO_H264_PROFILE_IDC_BASELINE; // Baseline profile - sps_parameter.level_idc = STD_VIDEO_H264_LEVEL_1_0; // Level 1.0 + sps_parameter.profile_idc = STD_VIDEO_H264_PROFILE_IDC_HIGH; // Baseline profile + sps_parameter.level_idc = STD_VIDEO_H264_LEVEL_4_1; // Level 1.0 sps_parameter.seq_parameter_set_id = this->sequence_parameter_id; // Id of the sequence parameter set sps_parameter.chroma_format_idc = STD_VIDEO_H264_CHROMA_FORMAT_IDC_420; // Not Required sps_parameter.bit_depth_luma_minus8 = 0; // Not Required @@ -530,7 +570,7 @@ bool Encoder::create_parameters(lava::device_ptr device) sps_parameter.offset_for_non_ref_pic = 0; // Not Required sps_parameter.offset_for_top_to_bottom_field = 0; // Not Required sps_parameter.num_ref_frames_in_pic_order_cnt_cycle = 0; // Not Required - sps_parameter.max_num_ref_frames = 0; // Set to 0 reference frames therefore only i-frames + sps_parameter.max_num_ref_frames = 1; // Set to 0 reference frames therefore only i-frames sps_parameter.pic_width_in_mbs_minus1 = this->setting_block_count.x - 1; // Set image width in macroblocks sps_parameter.pic_height_in_map_units_minus1 = this->setting_block_count.y - 1;// Set image height in macroblocks sps_parameter.frame_crop_left_offset = 0; // Set no crop left @@ -544,14 +584,14 @@ bool Encoder::create_parameters(lava::device_ptr device) //H.264 Specification Section 7.4.2.2: StdVideoH264PpsFlags pps_flags; - pps_flags.transform_8x8_mode_flag = 0; // Set to zero + pps_flags.transform_8x8_mode_flag = 1; // Set to zero pps_flags.redundant_pic_cnt_present_flag = 0; // Set to zero pps_flags.constrained_intra_pred_flag = 0; // Set to zero - pps_flags.deblocking_filter_control_present_flag = 0; // Set to zero, no deblocking + pps_flags.deblocking_filter_control_present_flag = 1; // Set to zero, no deblocking pps_flags.weighted_bipred_idc_flag = 0; // Set to zero pps_flags.weighted_pred_flag = 0; // Set to zero pps_flags.pic_order_present_flag = 0; // Set to zero - pps_flags.entropy_coding_mode_flag = 0; // Set to zero, use CABAC for encoding + pps_flags.entropy_coding_mode_flag = 1; // Set to zero, use CABAC for encoding pps_flags.pic_scaling_matrix_present_flag = 0; // Set to zero StdVideoH264PictureParameterSet pps_parameter; @@ -682,8 +722,8 @@ bool Encoder::create_sampler(lava::device_ptr device) sampler_create_info.maxAnisotropy = 1.0f; sampler_create_info.compareEnable = VK_FALSE; sampler_create_info.compareOp = VK_COMPARE_OP_LESS; - sampler_create_info.minLod = 0; - sampler_create_info.maxLod = VK_LOD_CLAMP_NONE; + sampler_create_info.minLod = 0.0f; + sampler_create_info.maxLod = 0.0f; sampler_create_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK; sampler_create_info.unnormalizedCoordinates = VK_TRUE; @@ -848,6 +888,10 @@ bool Encoder::create_input_images(lava::device_ptr device, EncoderFrame::Ptr fra image_extend_subsampled.height = this->setting_image_size.y / 2; image_extend_subsampled.depth = 1; + std::array<uint32_t, 2> queue_families; + queue_families[0] = this->default_queue.family; + queue_families[1] = this->encode_queue->family; + VkImageCreateInfo luma_create_info; luma_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; luma_create_info.pNext = nullptr; @@ -859,10 +903,10 @@ bool Encoder::create_input_images(lava::device_ptr device, EncoderFrame::Ptr fra luma_create_info.arrayLayers = 1; luma_create_info.samples = VK_SAMPLE_COUNT_1_BIT; luma_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; - luma_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; - luma_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - luma_create_info.queueFamilyIndexCount = 0; - luma_create_info.pQueueFamilyIndices = nullptr; //Use explicit ownership transfers + luma_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + luma_create_info.sharingMode = VK_SHARING_MODE_CONCURRENT; //VK_SHARING_MODE_EXCLUSIVE; + luma_create_info.queueFamilyIndexCount = queue_families.size(); //0; + luma_create_info.pQueueFamilyIndices = queue_families.data(); //nullptr; //Use explicit ownership transfers luma_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; if (vkCreateImage(device->get(), &luma_create_info, lava::memory::alloc(), &frame->input_luma) != VK_SUCCESS) @@ -882,9 +926,9 @@ bool Encoder::create_input_images(lava::device_ptr device, EncoderFrame::Ptr fra chroma_create_info.samples = VK_SAMPLE_COUNT_1_BIT; chroma_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; chroma_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; - chroma_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - chroma_create_info.queueFamilyIndexCount = 0; - chroma_create_info.pQueueFamilyIndices = nullptr; //Use explicit ownership transfers + chroma_create_info.sharingMode = VK_SHARING_MODE_CONCURRENT; //VK_SHARING_MODE_EXCLUSIVE; + chroma_create_info.queueFamilyIndexCount = queue_families.size(); //0; + chroma_create_info.pQueueFamilyIndices = queue_families.data(); //nullptr; //Use explicit ownership transfers chroma_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; if (vkCreateImage(device->get(), &chroma_create_info, lava::memory::alloc(), &frame->input_chroma) != VK_SUCCESS) @@ -903,13 +947,13 @@ bool Encoder::create_input_images(lava::device_ptr device, EncoderFrame::Ptr fra chroma_subsampled_create_info.arrayLayers = 1; chroma_subsampled_create_info.samples = VK_SAMPLE_COUNT_1_BIT; chroma_subsampled_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; - chroma_subsampled_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; - chroma_subsampled_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - chroma_subsampled_create_info.queueFamilyIndexCount = 0; - chroma_subsampled_create_info.pQueueFamilyIndices = nullptr; //Use explicit ownership transfers + chroma_subsampled_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + chroma_subsampled_create_info.sharingMode = VK_SHARING_MODE_CONCURRENT; //VK_SHARING_MODE_EXCLUSIVE; + chroma_subsampled_create_info.queueFamilyIndexCount = queue_families.size(); //0; + chroma_subsampled_create_info.pQueueFamilyIndices = queue_families.data(); //nullptr; //Use explicit ownership transfers chroma_subsampled_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - if (vkCreateImage(device->get(), &chroma_create_info, lava::memory::alloc(), &frame->input_chroma_subsampled) != VK_SUCCESS) + if (vkCreateImage(device->get(), &chroma_subsampled_create_info, lava::memory::alloc(), &frame->input_chroma_subsampled) != VK_SUCCESS) { return false; } @@ -926,9 +970,9 @@ bool Encoder::create_input_images(lava::device_ptr device, EncoderFrame::Ptr fra combined_create_info.samples = VK_SAMPLE_COUNT_1_BIT; combined_create_info.tiling = VK_IMAGE_TILING_OPTIMAL; combined_create_info.usage = VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR; - combined_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - combined_create_info.queueFamilyIndexCount = 0; - combined_create_info.pQueueFamilyIndices = nullptr; //Use explicit ownership transfers + combined_create_info.sharingMode = VK_SHARING_MODE_CONCURRENT; //VK_SHARING_MODE_EXCLUSIVE; + combined_create_info.queueFamilyIndexCount = queue_families.size(); //0; + combined_create_info.pQueueFamilyIndices = queue_families.data(); //nullptr; //Use explicit ownership transfers combined_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; if (vkCreateImage(device->get(), &combined_create_info, lava::memory::alloc(), &frame->input_combined) != VK_SUCCESS) @@ -1615,17 +1659,17 @@ void Encoder::encode_pass_frame_setup(VkCommandBuffer command_buffer, EncoderFra image_range.baseArrayLayer = 0; image_range.layerCount = 1; - VkImageMemoryBarrier input_barrier; + /*VkImageMemoryBarrier input_barrier; input_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; input_barrier.pNext = nullptr; input_barrier.srcAccessMask = 0; input_barrier.dstAccessMask = 0; - input_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; - input_barrier.newLayout = VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR; + input_barrier.oldLayout = (VkImageLayout)0; + input_barrier.newLayout = (VkImageLayout)0; input_barrier.srcQueueFamilyIndex = this->default_queue.family; input_barrier.dstQueueFamilyIndex = this->encode_queue->family; input_barrier.image = frame->input_combined; - input_barrier.subresourceRange = image_range; + input_barrier.subresourceRange = image_range;*/ VkImageMemoryBarrier slot_barrier; slot_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; @@ -1639,12 +1683,26 @@ void Encoder::encode_pass_frame_setup(VkCommandBuffer command_buffer, EncoderFra slot_barrier.image = frame->slot_image; slot_barrier.subresourceRange = image_range; - std::array<VkImageMemoryBarrier, 2> image_barriers; - image_barriers[0] = input_barrier; - image_barriers[1] = slot_barrier; + std::array<VkImageMemoryBarrier, 1> image_barriers; + //image_barriers[0] = input_barrier; + image_barriers[0] = slot_barrier; //ACHTUNG Array Slot vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, image_barriers.size(), image_barriers.data()); + VkImageMemoryBarrier other_barrier; + other_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + other_barrier.pNext = nullptr; + other_barrier.srcAccessMask = 0; + other_barrier.dstAccessMask = 0; + other_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL; + other_barrier.newLayout = VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR; + other_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; //this->default_queue.family; + other_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; //this->encode_queue->family; + other_barrier.image = frame->input_combined; + other_barrier.subresourceRange = image_range; + + //vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &other_barrier); + VkOffset2D encode_offset; encode_offset.x = 0; encode_offset.y = 0; @@ -1740,17 +1798,17 @@ void Encoder::encode_pass_frame_command(VkCommandBuffer command_buffer, EncoderF //--- Slot Info ---------------------------------------------------------------- StdVideoEncodeH264PictureInfoFlags slot_flags; - slot_flags.idr_flag = 1; - slot_flags.is_reference_flag = 1; + slot_flags.idr_flag = (this->frame_index == 0) ? 1 : 0; //1; + slot_flags.is_reference_flag = (this->frame_index == 0) ? 1 : 0; //1; slot_flags.used_for_long_term_reference = 0; StdVideoEncodeH264PictureInfo slot_info; slot_info.flags = slot_flags; slot_info.seq_parameter_set_id = this->sequence_parameter_id; slot_info.pic_parameter_set_id = this->picture_parameter_id; - slot_info.pictureType = STD_VIDEO_H264_PICTURE_TYPE_IDR; - slot_info.frame_num = 0; - slot_info.PicOrderCnt = this->frame_index; + slot_info.pictureType = STD_VIDEO_H264_PICTURE_TYPE_I; //STD_VIDEO_H264_PICTURE_TYPE_IDR; + slot_info.frame_num = (this->frame_index == 0) ? 0 : 1; //0; + slot_info.PicOrderCnt = (this->frame_index * 2) % 256; //this->frame_index; //--- Slice Info ---------------------------------------------------------------- @@ -1765,7 +1823,7 @@ void Encoder::encode_pass_frame_command(VkCommandBuffer command_buffer, EncoderF slice_parameters.flags = slice_flags; slice_parameters.first_mb_in_slice = 0; slice_parameters.slice_type = STD_VIDEO_H264_SLICE_TYPE_I; - slice_parameters.idr_pic_id = this->frame_index; + slice_parameters.idr_pic_id = 0; //this->frame_index; slice_parameters.num_ref_idx_l0_active_minus1 = 0; slice_parameters.num_ref_idx_l1_active_minus1 = 0; slice_parameters.cabac_init_idc = (StdVideoH264CabacInitIdc) 0; diff --git a/src/utility/encoder.hpp b/src/utility/encoder.hpp index 295d063ef4a708bc2fbd36c637cb6847912b3e71..1efad299c9f7a038e95b25c9fc2ab886709856d0 100644 --- a/src/utility/encoder.hpp +++ b/src/utility/encoder.hpp @@ -130,7 +130,7 @@ private: glm::uvec2 setting_frame_crop; glm::uvec2 setting_image_size; uint32_t setting_buffer_size; - + private: VkSampler sampler = nullptr; VkCommandPool command_pool = nullptr;