Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Kodlanmış bir video çerçevesinde her bloğu kodlamak için kullanılan bit sayısının bir haritasını depolar.
Veri türü
Bir IMFMediaBuffer.
Açıklamalar
Kullanılan bit eşlemesine erişmek, geliştiricilerin kodlanmış bir çerçevede bit ayırmayı analiz etmesine olanak tanır. Bu, verimsizlikleri tanılamaya, kodlama stratejilerini ayarlamaya ve videonun kritik bölgelerinin uygun bit ayırmasını aldığından emin olmasına yardımcı olabilir.
Kullanılan bit eşlemesi bir uint32_t dizisidir. Her bloğun, bloğu kodlamada kullanılan bit sayısını temsil eden bir uint32_t değeri vardır. Geliştirici , CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize ve video çerçevesi genişliği ve yüksekliği kullanarak haritanın boyutunu belirlemelidir (Genişliği/yüksekliği blok boyutuna bölün. Genişlik/yükseklik, blok boyutunun tam katı değilse, blok boyutunun sonraki katına yuvarlayın. Bu, satır ve sütun sayısını sağlayarak video çerçevesine uygun hizalamayı sağlar. Harita soldan sağa ve yukarıdan aşağıya doğrudur.
Çıkış örneğine QP eşlemesini içeren bir IMFMediaBuffer eklemek için IMFAttributes::SetUnknown kullanın. Çıkış örneğinden QP haritasını içeren IMFMediaBuffer'ı almak için IMFAttributes::GetUnknown kullanın.
Kullanılan bit eşlemesi yalnızca çerçevenin tamamı kodlamayı tamamladığında bildirilmelidir. Kodlayıcı birden çok dilim kullanıyorsa, PSNR arabelleği son dilimin IMFSample'ına eklenmelidir.
Örnekler
Aşağıdaki örnek, kullanılan bit eşleme özelliğini raporlamayı etkinleştirmek veya devre dışı bırakmak üzere bir kodlayıcı MFT'sini yapılandırmak için CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize özelliğinin nasıl kullanılacağını gösterir. Blok boyutu sıfırsa devre dışı bırakılır. Sıfır değilse etkinleştirilir.
#include <codecapi.h>
#include <mfapi.h>
#include <wil.com.h>
#include <wil/result_macros.h>
// Inform an encoder MFT to enable or disable reporting the bits used map feature.
// This function assumes that the encoder MFT supports ICodecAPI interface.
// It checks whether the property CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize is supported.
// If not supported, it returns E_NOTIMPL.
HRESULT ConfigureEncoderForBitsUsedMap(_In_ IMFTransform* encoder, uint32_t blockSize)
{
wil::com_ptr_nothrow<ICodecAPI> codecAPI;
RETURN_IF_FAILED(wil::com_query_to_nothrow(encoder, &codecAPI));
// Check if the encoder supports the property
if (!codecAPI->IsSupported(&CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize))
{
return E_NOTIMPL;
}
// Configure encoder
wil::unique_variant value;
value.vt = VT_UI4;
value.ulVal = blockSize; // zero: disable; non-zero: enable
return codecAPI->SetValue(&CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize, &value);
}
Aşağıdaki örnekte , ICodecAPI'yi destekleyen bir kodlayıcı MFT'sinin uygulamaları tarafından kullanılabilecek bir yardımcı işlev gösterilmektedir. işlevi, kodlayıcı MFT'sinde kullanılan bit eşleme raporlamasının etkinleştirilip etkinleştirilmediğinin nasıl denetlendiğini gösterir. Etkinleştirilirse işlev, kullanılan bit eşlemesinin çıkış örneğine nasıl eklenip eklenmediğini gösterir. Bu, her çıkış örneğinin eksiksiz bir çerçeve içerdiğini varsayar. Kodlayıcı birden çok dilim kullanıyorsa, kullanılan bitler haritası yalnızca son dilimin IMFSample'sine eklenmelidir.
#include <mfapi.h>
#include <mfobjects.h>
#include <codecapi.h>
#include <wil.com.h>
#include <wil/result_macros.h>
// Function to query and attach bits used map to output samples
HRESULT ReportBitsUsedMapOnOutputSample(
_In_ IMFTransform* encoder,
_In_ IMFSample* outputSample,
_In_ IMFMediaBuffer* bitsUsedMap // IMFMediaBuffer could be the GPU resource for bits used map if using hardware encoder
)
{
RETURN_HR_IF_NULL(E_INVALIDARG, encoder);
RETURN_HR_IF_NULL(E_INVALIDARG, outputSample);
RETURN_HR_IF_NULL(E_INVALIDARG, bitsUsedMap);
// Query the encoder's codec API to check if bits used Map reporting is enabled
wil::com_ptr_nothrow<ICodecAPI> codecAPI;
RETURN_IF_FAILED(wil::com_query_to_nothrow(encoder, &codecAPI));
wil::unique_variant value;
RETURN_IF_FAILED(codecAPI->GetValue(&CODECAPI_AVEncVideoOutputBitsUsedMapBlockSize, &value));
if (value.vt != VT_UI4 || !value.ulVal) {
return S_OK; // Bits Used Map not enabled
}
// Attach the IMFMediaBuffer (Bits Used Map) to the output sample's attributes
wil::com_ptr_nothrow<IMFAttributes> sampleAttributes;
RETURN_IF_FAILED(wil::com_query_to_nothrow(outputSample, &sampleAttributes));
return sampleAttributes->SetUnknown(MFSampleExtension_VideoEncodeBitsUsedMap, bitsUsedMap);
}
Aşağıdaki örnekte, bir uygulamanın kodlayıcı MFT tarafından üretilen IMFSample nesnelerinden kullanılan bit eşleme verilerini nasıl alabildiği gösterilmektedir.
#include <mfapi.h>
#include <mfobjects.h>
#include <codecapi.h>
#include <wil.com.h>
#include <wil/result_macros.h>
// Function to retrieve the bits used map data from an output sample
HRESULT RetrieveBitsUsedMapFromOutputSample(
_In_ IMFSample* outputSample,
_COM_Outptr_result_maybenull_ IMFMediaBuffer** bitsUsedMap // Output: IMFMediaBuffer containing the bits used map
)
{
RETURN_HR_IF_NULL(E_INVALIDARG, bitsUsedMap);
*bitsUsedMap = nullptr;
RETURN_HR_IF_NULL(E_INVALIDARG, outputSample);
// Retrieve the sample attributes
wil::com_ptr_nothrow<IMFAttributes> sampleAttributes;
RETURN_IF_FAILED(wil::com_query_to_nothrow(outputSample, &sampleAttributes));
// Retrieve the IMFMediaBuffer associated with the bits used map
(void)sampleAttributes->GetUnknown(MFSampleExtension_VideoEncodeBitsUsedMap, IID_PPV_ARGS(bitsUsedMap));
return S_OK;
}
Gereksinimler
| Gereksinim | Değer |
|---|---|
| Desteklenen en düşük düzeydeki istemci | Windows 11, derleme 26100 |
| Desteklenen en düşük sunucu | Windows Server 2025 |
| Başlık | mfapi.h |