/* INTEL CONFIDENTIAL
* Copyright (c) 2013 Intel Corporation.  All rights reserved.
* Copyright (c) Imagination Technologies Limited, UK
*
* The source code contained or described herein and all documents
* related to the source code ("Material") are owned by Intel
* Corporation or its suppliers or licensors.  Title to the
* Material remains with Intel Corporation or its suppliers and
* licensors.  The Material contains trade secrets and proprietary
* and confidential information of Intel or its suppliers and
* licensors. The Material is protected by worldwide copyright and
* trade secret laws and treaty provisions.  No part of the Material
* may be used, copied, reproduced, modified, published, uploaded,
* posted, transmitted, distributed, or disclosed in any way without
* Intel's prior express written permission.
*
* No license under any patent, copyright, trade secret or other
* intellectual property right is granted to or conferred upon you
* by disclosure or delivery of the Materials, either expressly, by
* implication, inducement, estoppel or otherwise. Any license
* under such intellectual property rights must be express and
* approved by Intel in writing.
*
* Authors:
*    Yao Cheng <yao.cheng@intel.com>
*
*/
//#define LOG_NDEBUG 0

#include <va/va.h>
#include <va/va_tpi.h>
#include "JPEGBlitter.h"
#include "JPEGDecoder.h"

#ifdef NDEBUG
#undef NDEBUG
#endif
#include <assert.h>
//#define LOG_TAG "JPEGBlitter"

JpegBlitter::JpegBlitter()
    :mDecoder(NULL),
    mConfigId(VA_INVALID_ID),
    mContextId(VA_INVALID_ID)
{
    // empty
}

JpegBlitter::~JpegBlitter()
{
    if (mDecoder) {
        destroyContext();
    }
}

void JpegBlitter::destroyContext()
{
    if (mDecoder == NULL)
        return;

    Mutex::Autolock autoLock(mLock);
    if (mDecoder) {
        vaDestroyContext(mDecoder->mDisplay, mContextId);
        mContextId = VA_INVALID_ID;
        vaDestroyConfig(mDecoder->mDisplay, mConfigId);
        mConfigId = VA_INVALID_ID;
        mDecoder = NULL;
    }
}

void JpegBlitter::setDecoder(JpegDecoder &decoder)
{
    destroyContext();
    Mutex::Autolock autoLock(mLock);
    mDecoder = &decoder;
    VAConfigAttrib  vpp_attrib;
    VAStatus st;
    vpp_attrib.type  = VAConfigAttribRTFormat;
    vpp_attrib.value = VA_RT_FORMAT_YUV420;
    st = vaCreateConfig(mDecoder->mDisplay, VAProfileNone,
                                VAEntrypointVideoProc,
                                &vpp_attrib,
                                1, &mConfigId);
    assert(st == VA_STATUS_SUCCESS);
    st = vaCreateContext(mDecoder->mDisplay, mConfigId, 1920, 1080, 0, NULL, 0, &mContextId);
    assert(st == VA_STATUS_SUCCESS);
}

