Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
572 changes: 572 additions & 0 deletions core/libs/prx/libSceVdecsw/AvcMetadata.cpp

Large diffs are not rendered by default.

55 changes: 55 additions & 0 deletions core/libs/prx/libSceVdecsw/AvcMetadata.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#pragma once

#include <cstddef>
#include <cstdint>
#include <memory>
#include <optional>
#include <span>

namespace SceVdecsw {

struct AvcPictureInfo {
std::uint64_t thisSize;
std::uint8_t isValid, reserved0[7];
std::uint64_t ptsData, dtsData, attachedData;
std::uint8_t idrPictureFlag, profileIdc, levelIdc, reserved1;
std::uint32_t picWidthInMbsMinus1, picHeightInMapUnitsMinus1;
std::uint8_t frameMbsOnlyFlag, frameCroppingFlag;
std::uint16_t reserved2;
std::uint32_t frameCropLeftOffset, frameCropRightOffset, frameCropTopOffset, frameCropBottomOffset;
std::uint8_t aspectRatioInfoPresentFlag, aspectRatioIdc;
std::uint16_t sarWidth, sarHeight;
std::uint8_t videoSignalTypePresentFlag, videoFormat, videoFullRangeFlag, colourDescriptionPresentFlag;
std::uint8_t colourPrimaries, transferCharacteristics, matrixCoefficients, timingInfoPresentFlag;
std::uint16_t reserved3;
std::uint32_t numUnitsInTick, timeScale;
std::uint8_t fixedFrameRateFlag, bitstreamRestrictionFlag, maxDecFrameBuffering, picStructPresentFlag;
std::uint8_t picStruct, fieldPicFlag, bottomFieldFlag, sequenceParameterSetPresentFlag;
std::uint8_t pictureParameterSetPresentFlag, auDelimiterPresentFlag, endOfSequencePresentFlag, endOfStreamPresentFlag;
std::uint8_t fillerDataPresentFlag, pictureTimingSeiPresentFlag, bufferingPeriodSeiPresentFlag;
std::uint8_t constraintSet0Flag, constraintSet1Flag, constraintSet2Flag, constraintSet3Flag, constraintSet4Flag, constraintSet5Flag;
std::uint8_t reserved4[3];
};

static_assert(sizeof(AvcPictureInfo) == 0x78);
static_assert(offsetof(AvcPictureInfo, ptsData) == 0x10);
static_assert(offsetof(AvcPictureInfo, picWidthInMbsMinus1) == 0x2c);
static_assert(offsetof(AvcPictureInfo, numUnitsInTick) == 0x58);
static_assert(offsetof(AvcPictureInfo, constraintSet5Flag) == 0x74);

class AvcMetadataParser {
public:
AvcMetadataParser();
~AvcMetadataParser();
AvcMetadataParser(const AvcMetadataParser&) = delete;
AvcMetadataParser& operator=(const AvcMetadataParser&) = delete;
std::optional<AvcPictureInfo> ParseAccessUnit(std::span<const std::uint8_t> annexB, std::uint64_t pts,
std::uint64_t dts, std::uint64_t attached);
void Reset();

private:
struct Impl;
std::unique_ptr<Impl> impl;
};

}
28 changes: 28 additions & 0 deletions core/libs/prx/libSceVdecsw/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
find_package(Threads REQUIRED)
add_library(libSceVdecsw SHARED EXCLUDE_FROM_ALL Export.cpp AvcMetadata.cpp)
target_include_directories(libSceVdecsw PRIVATE ${LIBS_INCLUDE_DIR})
target_link_libraries(libSceVdecsw PRIVATE ffmpeg Threads::Threads)
if(WIN32)
target_sources(libSceVdecsw PRIVATE Exports.def)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_link_options(libSceVdecsw PRIVATE "LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/Exports.map")
set_property(TARGET libSceVdecsw APPEND PROPERTY LINK_DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/Exports.map)
endif()
configure_windows_unwind(libSceVdecsw)

if(BUILD_TESTING)
add_test_executable(guest_avc_metadata_tests ${LIBS_INCLUDE_DIR}/tests/GuestAvcMetadata.cpp AvcMetadata.cpp)
target_include_directories(guest_avc_metadata_tests PRIVATE ${LIBS_INCLUDE_DIR})
target_link_libraries(guest_avc_metadata_tests PRIVATE libc)
configure_windows_unwind(guest_avc_metadata_tests)
add_test(NAME guest_avc_metadata COMMAND guest_avc_metadata_tests)
add_test_executable(guest_vdecsw_tests ${LIBS_INCLUDE_DIR}/tests/GuestVdecsw.cpp)
target_include_directories(guest_vdecsw_tests PRIVATE ${LIBS_INCLUDE_DIR})
target_link_libraries(guest_vdecsw_tests PRIVATE libSceVdecsw libc)
configure_windows_unwind(guest_vdecsw_tests)
add_test(NAME guest_vdecsw COMMAND guest_vdecsw_tests)
if(WIN32)
set_tests_properties(guest_vdecsw guest_avc_metadata PROPERTIES ENVIRONMENT_MODIFICATION
"PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceVdecsw>")
endif()
endif()
Loading