/*--------------------------------------------------------------------------
Copyright (c) 2010-2015, 2018 The Linux Foundation. All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright
      notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright
      notice, this list of conditions and the following disclaimer in the
      documentation and/or other materials provided with the distribution.
    * Neither the name of The Linux Foundation nor
      the names of its contributors may be used to endorse or promote
      products derived from this software without specific prior written
      permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--------------------------------------------------------------------------*/
#ifndef __DTSPARSER_H
#define __DTSPARSER_H

#include "OMX_Core.h"
#include "OMX_QCOMExtns.h"
#include "qc_omx_component.h"

#include<stdlib.h>

#include <stdio.h>
#include <inttypes.h>
#include <pthread.h>

#ifdef _ANDROID_
extern "C" {
#include<utils/Log.h>
}
#else
#define ALOGE(fmt, args...) fprintf(stderr, fmt, ##args)
#endif /* _ANDROID_ */

class omx_time_stamp_reorder
{
    class auto_lock {
        public:
            auto_lock(pthread_mutex_t *lock)
                : mLock(lock) {
                    if (mLock)
                        pthread_mutex_lock(mLock);
                }
            ~auto_lock() {
                if (mLock)
                    pthread_mutex_unlock(mLock);
            }
        private:
            pthread_mutex_t *mLock;
    };

    public:
        omx_time_stamp_reorder();
        ~omx_time_stamp_reorder();
        void set_timestamp_reorder_mode(bool flag);
        void enable_debug_print(bool flag);
        bool insert_timestamp(OMX_BUFFERHEADERTYPE *header);
        bool get_next_timestamp(OMX_BUFFERHEADERTYPE *header, bool is_interlaced);
        bool remove_time_stamp(OMX_TICKS ts, bool is_interlaced);
        void flush_timestamp();

    private:
#define TIME_SZ 64
        typedef struct timestamp {
            OMX_TICKS timestamps;
            bool in_use;
        } timestamp;
        typedef struct time_stamp_list {
            timestamp input_timestamps[TIME_SZ];
            time_stamp_list *next;
            time_stamp_list *prev;
            unsigned int entries_filled;
        } time_stamp_list;
        bool error;
        time_stamp_list *phead,*pcurrent;
        bool get_current_list();
        bool add_new_list();
        bool update_head();
        void delete_list();
        void handle_error() {
            ALOGE("Error handler called for TS Parser");

            if (error)
                return;

            error = true;
            delete_list();
        }
        bool reorder_ts;
        bool print_debug;
        pthread_mutex_t m_lock;
};
#endif
