test/createbuffer: fix bugs in createbuffer tests

vaCreateBuffer needs the sizeof the actual buffer
data structure associated with the buffer type, which
could be profile specific.

Previous test logic was passing the sizeof the
buffer "type" enum, which is wrong.

Fix the tests so that the correct buffer size is
calculated based on profile specific buffer types.

Several buffer types were removed from the previous test
parameters since their size may be application specific,
arbitrary, and/or require additional setup beyond the
capabilities of the current buffer test cases.  These
rules will need to be fleshed-out and tests for them
added later on.

Fixes #89

Signed-off-by: U. Artie Eoff <ullysses.a.eoff@intel.com>
diff --git a/test/test_va_api_createbuffer.cpp b/test/test_va_api_createbuffer.cpp
index cab4fa7..df730cd 100644
--- a/test/test_va_api_createbuffer.cpp
+++ b/test/test_va_api_createbuffer.cpp
@@ -30,37 +30,26 @@
 // VAEntrypoint. vaCreateBuffer doesn't require these itself but its input
 // parameter do care about them.
 
-typedef std::pair<VAProfile, VAEntrypoint> ConfigPair;
-
-struct TestInput
-{
-    ConfigPair config;
-    VABufferType bufferType;
-};
-
-std::ostream& operator<<(std::ostream& os, const TestInput& t)
-{
-    return os << t.config.first
-              << "," << t.config.second
-              << "," << t.bufferType
-    ;
-}
+typedef ::testing::WithParamInterface<std::tuple<VAProfile, VAEntrypoint,
+    VABufferType, size_t>> CreateBufferParamInterface;
 
 class VAAPICreateBuffer
     : public VAAPIFixture
-    , public ::testing::WithParamInterface<TestInput>
+    , public CreateBufferParamInterface
 {
 public:
     VAAPICreateBuffer()
-        : profile(GetParam().config.first)
-        , entrypoint(GetParam().config.second)
-        , bufferType(GetParam().bufferType)
+        : profile(::testing::get<0>(GetParam()))
+        , entrypoint(::testing::get<1>(GetParam()))
+        , bufferType(::testing::get<2>(GetParam()))
+        , bufferSize(::testing::get<3>(GetParam()))
     { }
 
 protected:
     const VAProfile& profile;
     const VAEntrypoint& entrypoint;
     const VABufferType& bufferType;
+    const size_t bufferSize;
 
     virtual void SetUp()
     {
@@ -75,84 +64,108 @@
     }
 };
 
-static const std::vector<ConfigPair> decoders = {
-    std::make_pair(VAProfileMPEG2Simple, VAEntrypointVLD),
-    std::make_pair(VAProfileMPEG2Main, VAEntrypointVLD),
-    std::make_pair(VAProfileH264Main, VAEntrypointVLD),
-    std::make_pair(VAProfileH264ConstrainedBaseline, VAEntrypointVLD),
-    std::make_pair(VAProfileH264High, VAEntrypointVLD),
-    std::make_pair(VAProfileH264MultiviewHigh, VAEntrypointVLD),
-    std::make_pair(VAProfileH264StereoHigh, VAEntrypointVLD),
-    std::make_pair(VAProfileVC1Simple, VAEntrypointVLD),
-    std::make_pair(VAProfileVC1Main, VAEntrypointVLD),
-    std::make_pair(VAProfileVC1Advanced, VAEntrypointVLD),
-    std::make_pair(VAProfileJPEGBaseline, VAEntrypointVLD),
-    std::make_pair(VAProfileVP8Version0_3, VAEntrypointVLD),
-    std::make_pair(VAProfileHEVCMain, VAEntrypointVLD),
-    std::make_pair(VAProfileHEVCMain10, VAEntrypointVLD),
-    std::make_pair(VAProfileVP9Profile0, VAEntrypointVLD),
-    std::make_pair(VAProfileVP9Profile2, VAEntrypointVLD),
+typedef std::tuple<Profiles, size_t> BufferSpec;
+typedef std::vector<BufferSpec> BufferSpecs;
+typedef std::map<VABufferType, BufferSpecs> BufferSpecsMap;
+
+using std::make_tuple;
+
+static const BufferSpecsMap decodeBufferSpecs = {
+    {VAPictureParameterBufferType, {
+        make_tuple(g_vaMPEG2Profiles, sizeof(VAPictureParameterBufferMPEG2)),
+        make_tuple(g_vaMPEG4Profiles, sizeof(VAPictureParameterBufferMPEG4)),
+        make_tuple(g_vaH264Profiles, sizeof(VAPictureParameterBufferH264)),
+        make_tuple(g_vaVC1Profiles, sizeof(VAPictureParameterBufferVC1)),
+        make_tuple(g_vaJPEGProfiles,
+            sizeof(VAPictureParameterBufferJPEGBaseline)),
+        make_tuple(g_vaVP8Profiles, sizeof(VAPictureParameterBufferVP8)),
+        make_tuple(g_vaHEVCProfiles, sizeof(VAPictureParameterBufferHEVC)),
+        make_tuple(g_vaVP9Profiles, sizeof(VADecPictureParameterBufferVP9)),
+    }},
+    {VAIQMatrixBufferType, {
+        make_tuple(g_vaMPEG2Profiles, sizeof(VAIQMatrixBufferMPEG2)),
+        make_tuple(g_vaMPEG4Profiles, sizeof(VAIQMatrixBufferMPEG4)),
+        make_tuple(g_vaH264Profiles, sizeof(VAIQMatrixBufferH264)),
+        make_tuple(g_vaJPEGProfiles, sizeof(VAIQMatrixBufferJPEGBaseline)),
+        make_tuple(g_vaVP8Profiles, sizeof(VAIQMatrixBufferVP8)),
+        make_tuple(g_vaHEVCProfiles, sizeof(VAIQMatrixBufferHEVC)),
+    }},
+    {VASliceParameterBufferType, {
+        make_tuple(g_vaMPEG2Profiles, sizeof(VASliceParameterBufferMPEG2)),
+        make_tuple(g_vaMPEG4Profiles, sizeof(VASliceParameterBufferMPEG4)),
+        make_tuple(g_vaH264Profiles, sizeof(VASliceParameterBufferH264)),
+        make_tuple(g_vaVC1Profiles, sizeof(VASliceParameterBufferVC1)),
+        make_tuple(g_vaJPEGProfiles,
+            sizeof(VASliceParameterBufferJPEGBaseline)),
+        make_tuple(g_vaVP8Profiles, sizeof(VASliceParameterBufferVP8)),
+        make_tuple(g_vaHEVCProfiles, sizeof(VASliceParameterBufferHEVC)),
+        make_tuple(g_vaVP9Profiles, sizeof(VASliceParameterBufferVP9)),
+    }},
+    {VAMacroblockParameterBufferType, {
+        make_tuple(g_vaMPEG2Profiles, sizeof(VAMacroblockParameterBufferMPEG2)),
+    }},
+    {VAQMatrixBufferType, {
+        make_tuple(g_vaJPEGProfiles, sizeof(VAQMatrixBufferJPEG)),
+        make_tuple(g_vaVP8Profiles, sizeof(VAQMatrixBufferVP8)),
+        make_tuple(g_vaHEVCProfiles, sizeof(VAQMatrixBufferHEVC)),
+    }},
+    {VAHuffmanTableBufferType, {
+        make_tuple(g_vaJPEGProfiles, sizeof(VAHuffmanTableBufferJPEGBaseline)),
+    }},
+    {VAProbabilityBufferType, {
+        make_tuple(g_vaVP8Profiles, sizeof(VAProbabilityDataBufferVP8)),
+    }},
 };
 
-// VAProtectedSliceDataBufferType left out on purpose
-static const BufferTypes decoderBufferTypes = {
-    VAPictureParameterBufferType,
-    VAIQMatrixBufferType,
-    VABitPlaneBufferType,
-    VASliceGroupMapBufferType,
-    VASliceParameterBufferType,
-    VASliceDataBufferType,
-    VAMacroblockParameterBufferType,
-    VAResidualDataBufferType,
-    VADeblockingParameterBufferType,
-    VAImageBufferType,
-    VAQMatrixBufferType,
-    VAHuffmanTableBufferType,
-    VAProbabilityBufferType,
+static const BufferSpecsMap encodeBufferSpecs = {
+    {VAEncSequenceParameterBufferType, {
+        make_tuple(g_vaMPEG2Profiles,
+            sizeof(VAEncSequenceParameterBufferMPEG2)),
+        make_tuple(g_vaMPEG4Profiles,
+            sizeof(VAEncSequenceParameterBufferMPEG4)),
+        make_tuple(g_vaH263Profiles, sizeof(VAEncSequenceParameterBufferH263)),
+        make_tuple(g_vaH264Profiles, sizeof(VAEncSequenceParameterBufferH264)),
+        make_tuple(g_vaVP8Profiles, sizeof(VAEncSequenceParameterBufferVP8)),
+        make_tuple(g_vaHEVCProfiles, sizeof(VAEncSequenceParameterBufferHEVC)),
+        make_tuple(g_vaVP9Profiles, sizeof(VAEncSequenceParameterBufferVP9)),
+    }},
+    {VAEncPictureParameterBufferType, {
+        make_tuple(g_vaMPEG2Profiles, sizeof(VAEncPictureParameterBufferMPEG2)),
+        make_tuple(g_vaMPEG4Profiles, sizeof(VAEncPictureParameterBufferMPEG4)),
+        make_tuple(g_vaH263Profiles, sizeof(VAEncPictureParameterBufferH263)),
+        make_tuple(g_vaH264Profiles, sizeof(VAEncPictureParameterBufferH264)),
+        make_tuple(g_vaJPEGProfiles, sizeof(VAEncPictureParameterBufferJPEG)),
+        make_tuple(g_vaVP8Profiles, sizeof(VAEncPictureParameterBufferVP8)),
+        make_tuple(g_vaHEVCProfiles, sizeof(VAEncPictureParameterBufferHEVC)),
+        make_tuple(g_vaVP9Profiles, sizeof(VAEncPictureParameterBufferVP9)),
+    }},
+    {VAEncSliceParameterBufferType, {
+        make_tuple(g_vaMPEG2Profiles, sizeof(VAEncSliceParameterBufferMPEG2)),
+        make_tuple(g_vaH264Profiles, sizeof(VAEncSliceParameterBufferH264)),
+        make_tuple(g_vaJPEGProfiles, sizeof(VAEncSliceParameterBufferJPEG)),
+        make_tuple(g_vaHEVCProfiles, sizeof(VAEncSliceParameterBufferHEVC)),
+    }},
+    {VAEncPackedHeaderParameterBufferType, {
+        make_tuple(g_vaProfiles, sizeof(VAEncPackedHeaderParameterBuffer)),
+    }},
+    {VAEncMiscParameterBufferType, {
+        make_tuple(g_vaProfiles, sizeof(VAEncMiscParameterBuffer)),
+    }},
 };
 
-static const std::vector<ConfigPair> encoders = {
-    std::make_pair(VAProfileMPEG2Simple, VAEntrypointEncSlice),
-    std::make_pair(VAProfileMPEG2Main, VAEntrypointEncSlice),
-    std::make_pair(VAProfileH264Main, VAEntrypointEncSlice),
-    std::make_pair(VAProfileH264ConstrainedBaseline, VAEntrypointEncSlice),
-    std::make_pair(VAProfileH264High, VAEntrypointEncSlice),
-    std::make_pair(VAProfileH264MultiviewHigh, VAEntrypointEncSlice),
-    std::make_pair(VAProfileH264StereoHigh, VAEntrypointEncSlice),
-    std::make_pair(VAProfileH264Main, VAEntrypointFEI),
-    std::make_pair(VAProfileH264ConstrainedBaseline, VAEntrypointFEI),
-    std::make_pair(VAProfileH264High, VAEntrypointFEI),
-    std::make_pair(VAProfileJPEGBaseline, VAEntrypointEncSlice),
-    std::make_pair(VAProfileVP8Version0_3, VAEntrypointEncSlice),
-    std::make_pair(VAProfileHEVCMain, VAEntrypointEncSlice),
-    std::make_pair(VAProfileHEVCMain10, VAEntrypointEncSlice),
-    std::make_pair(VAProfileVP9Profile0, VAEntrypointEncSlice),
-};
-
-// VAEncMacroblockParameterBufferType left out on purpose
-static const BufferTypes encoderBufferTypes = {
-    VAEncCodedBufferType,
-    VAEncSequenceParameterBufferType,
-    VAEncPictureParameterBufferType,
-    VAEncSliceParameterBufferType,
-    VAEncPackedHeaderParameterBufferType,
-    VAEncPackedHeaderDataBufferType,
-    VAEncMiscParameterBufferType,
-    VAEncMacroblockMapBufferType,
-    VAEncFEIMVBufferType,
-    VAEncFEIMBCodeBufferType,
-    VAEncFEIDistortionBufferType,
-    VAEncFEIMBControlBufferType,
-    VAEncFEIMVPredictorBufferType,
-};
-
-static const std::vector<ConfigPair> vpps = {
-    std::make_pair(VAProfileNone, VAEntrypointVideoProc),
-};
-
-static const BufferTypes postProcessorBufferTypes = {
-    VAProcPipelineParameterBufferType,
-    VAProcFilterParameterBufferType,
+static const BufferSpecsMap vppBufferSpecs = {
+    {VAProcPipelineParameterBufferType, {
+        make_tuple(g_vaNoneProfiles, sizeof(VAProcPipelineParameterBuffer)),
+    }},
+    {VAProcFilterParameterBufferType, {
+        make_tuple(g_vaNoneProfiles, sizeof(VAProcFilterParameterBuffer)),
+        make_tuple(g_vaNoneProfiles,
+            sizeof(VAProcFilterParameterBufferDeinterlacing)),
+        make_tuple(g_vaNoneProfiles,
+            sizeof(VAProcFilterParameterBufferColorBalance)),
+        make_tuple(g_vaNoneProfiles,
+            sizeof(VAProcFilterParameterBufferTotalColorCorrection)),
+    }},
 };
 
 TEST_P(VAAPICreateBuffer, CreateBufferWithOutData)
@@ -168,45 +181,49 @@
         return;
     }
 
-    Resolution minRes, maxRes;
-
     // profile and entrypoint are supported
     createConfig(profile, entrypoint);
 
     // vaCreateContext input requires resolution, since this test
     // doesn't create surfaces, passing min resolution should provide
     // the desired result.
-    getMinMaxSurfaceResolution(minRes,maxRes);
+    Resolution minRes, maxRes;
+    getMinMaxSurfaceResolution(minRes, maxRes);
     doCreateContext(minRes);
 
-    doCreateBuffer(bufferType);
-    doDestroyBuffer();
+    createBuffer(bufferType, bufferSize);
+    destroyBuffer();
 
     doDestroyContext();
     destroyConfig();
 }
 
-std::vector<TestInput> generateInput()
+std::vector<CreateBufferParamInterface::ParamType> generateInput()
 {
-    std::vector<TestInput> inputs;
+    std::vector<CreateBufferParamInterface::ParamType> inputs;
 
-    for (auto config : decoders) {
-        for (auto bufferType : decoderBufferTypes) {
-            inputs.push_back(TestInput{config, bufferType});
+    const auto addBufferSpecs = [&](
+        const BufferSpecsMap& bsm, const Entrypoints& entrypoints)
+    {
+        for (const auto& specs : bsm) {
+            const auto& bufferType = std::get<0>(specs);
+            for (const auto& spec: std::get<1>(specs)) {
+                const auto& bufferSize = std::get<1>(spec);
+                for (const auto& profile : std::get<0>(spec)) {
+                    for (const auto& entrypoint : entrypoints) {
+                        inputs.push_back(
+                            make_tuple(
+                                profile, entrypoint, bufferType, bufferSize));
+                    }
+                }
+            }
         }
-    }
+    };
 
-    for (auto config : encoders) {
-        for (auto bufferType : encoderBufferTypes) {
-            inputs.push_back(TestInput{config, bufferType});
-        }
-    }
-
-    for (auto config : vpps) {
-        for (auto bufferType : postProcessorBufferTypes) {
-            inputs.push_back(TestInput{config, bufferType});
-        }
-    }
+    addBufferSpecs(decodeBufferSpecs, {VAEntrypointVLD,});
+    addBufferSpecs(encodeBufferSpecs, {VAEntrypointEncSlice,
+        VAEntrypointEncSliceLP, VAEntrypointEncPicture,});
+    addBufferSpecs(vppBufferSpecs, {VAEntrypointVideoProc,});
 
     return inputs;
 }
diff --git a/test/test_va_api_fixture.cpp b/test/test_va_api_fixture.cpp
index 00702c5..423e2e8 100644
--- a/test/test_va_api_fixture.cpp
+++ b/test/test_va_api_fixture.cpp
@@ -398,6 +398,24 @@
     }
 }
 
+void VAAPIFixture::createBuffer(const VABufferType& bufferType,
+    const size_t bufferSize, const VAStatus& expectation)
+{
+    ASSERT_INVALID_ID(m_bufferID)
+        << "test logic error: did you forget to call destroyBuffer?";
+
+    EXPECT_STATUS_EQ(
+        expectation,
+        vaCreateBuffer(m_vaDisplay, m_contextID, bufferType, bufferSize,
+            1, NULL, &m_bufferID));
+}
+
+void VAAPIFixture::destroyBuffer(const VAStatus& expectation)
+{
+    EXPECT_STATUS_EQ(expectation, vaDestroyBuffer(m_vaDisplay, m_bufferID));
+    m_bufferID = VA_INVALID_ID;
+}
+
 void VAAPIFixture::doCreateContext(const Resolution& resolution,
     const VAStatus& expectation)
 {
@@ -413,17 +431,6 @@
     ASSERT_STATUS_EQ(expectation, vaDestroyContext(m_vaDisplay, m_contextID));
 }
 
-void VAAPIFixture::doCreateBuffer(const VABufferType& bufferType)
-{
-    ASSERT_STATUS(vaCreateBuffer(m_vaDisplay, m_contextID, bufferType,
-                                 sizeof(bufferType), 1, NULL, &m_bufferID));
-}
-
-void VAAPIFixture::doDestroyBuffer()
-{
-    ASSERT_STATUS(vaDestroyBuffer(m_vaDisplay, m_bufferID));
-}
-
 void VAAPIFixture::doTerminate()
 {
     EXPECT_STATUS(vaTerminate(m_vaDisplay));
diff --git a/test/test_va_api_fixture.h b/test/test_va_api_fixture.h
index c88df16..1b57dc1 100644
--- a/test/test_va_api_fixture.h
+++ b/test/test_va_api_fixture.h
@@ -46,8 +46,6 @@
     void doCreateContext(const Resolution&,
         const VAStatus& expectation = VA_STATUS_SUCCESS);
     void doDestroyContext(const VAStatus& expectation = VA_STATUS_SUCCESS);
-    void doCreateBuffer(const VABufferType&);
-    void doDestroyBuffer();
 
     void doLogSkipTest(const VAProfile&, const VAEntrypoint&) const;
 
@@ -73,6 +71,10 @@
         const VAStatus& = VA_STATUS_SUCCESS) const;
     void destroySurfaces(Surfaces&) const;
 
+    void createBuffer(const VABufferType&, const size_t,
+        const VAStatus& = VA_STATUS_SUCCESS);
+    void destroyBuffer(const VAStatus& = VA_STATUS_SUCCESS);
+
 protected:
     // You can remove any or all of the following functions if its body
     // is empty.