1dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand/*--------------------------------------------------------------------------
2dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCopyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
3dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
4dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandRedistribution and use in source and binary forms, with or without
5dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandmodification, are permitted provided that the following conditions are met:
6dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Redistributions of source code must retain the above copyright
7dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      notice, this list of conditions and the following disclaimer.
8dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Redistributions in binary form must reproduce the above copyright
9dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      notice, this list of conditions and the following disclaimer in the
10dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      documentation and/or other materials provided with the distribution.
11dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Neither the name of Code Aurora nor
12dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      the names of its contributors may be used to endorse or promote
13dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      products derived from this software without specific prior written
14dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand      permission.
15dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
16dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand--------------------------------------------------------------------------*/
28dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#include "ts_parser.h"
29dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
30dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand#define DEBUG ALOGE
31dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandvoid omx_time_stamp_reorder::set_timestamp_reorder_mode(bool mode)
32dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
33dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	reorder_ts = mode;
34dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
35dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
36dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandvoid omx_time_stamp_reorder::enable_debug_print(bool flag)
37dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
38dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        print_debug = flag;
39dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
40dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
41dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandomx_time_stamp_reorder::~omx_time_stamp_reorder()
42dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
43dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	delete_list();
44dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
45dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
46dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandomx_time_stamp_reorder::omx_time_stamp_reorder()
47dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
48dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	reorder_ts = false;
49dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	phead = pcurrent = NULL;
50dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	error = false;
51dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        print_debug = false;
52dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
53dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
54dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandvoid omx_time_stamp_reorder::delete_list()
55dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
56dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	time_stamp_list *ptemp;
57dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (!phead) return;
58dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	while(phead->next != phead) {
59dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ptemp = phead;
60dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		phead = phead->next;
61dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		phead->prev = ptemp->prev;
62dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ptemp->prev->next = phead;
63dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		delete ptemp;
64dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
65dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	delete phead;
66dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	phead = NULL;
67dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
68dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
69dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandbool omx_time_stamp_reorder::get_current_list()
70dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
71dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (!phead) {
72dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if(!add_new_list()) {
73dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			handle_error();
74dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			return false;
75dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
76dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
77dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	pcurrent = phead->prev;
78dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	return true;
79dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
80dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
81dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandbool omx_time_stamp_reorder::update_head()
82dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
83dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	time_stamp_list *ptemp;
84dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if(!phead) return false;
85dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (phead->next != phead) {
86dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ptemp = phead;
87dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		phead = ptemp->next;
88dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		phead->prev = ptemp->prev;
89dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ptemp->prev->next = phead;
90dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		delete ptemp;
91dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
92dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	return true;
93dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
94dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
95dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandbool omx_time_stamp_reorder::add_new_list()
96dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
97dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	bool status = true;
98dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	time_stamp_list *ptemp = NULL;
99dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (!phead) {
100dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ptemp = phead = new time_stamp_list;
101dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (!phead) {
102dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			handle_error();
103dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			status = false;
104dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			return status;
105dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
106dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		phead->prev = phead->next = phead;
107dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	} else {
108dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ptemp = new time_stamp_list;
109dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (!ptemp) {
110dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			handle_error();
111dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			status = false;
112dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			return status;
113dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
114dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ptemp->prev = phead->prev;
115dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ptemp->next = phead;
116dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		phead->prev->next = ptemp;
117dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		phead->prev = ptemp;
118dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
119dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	ptemp->entries_filled = 0;
120dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	for(int i=0; i < TIME_SZ; i++) {
121dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ptemp->input_timestamps[i].in_use = false;
122dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		ptemp->input_timestamps[i].timestamps = -1;
123dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
124dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	return status;
125dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
126dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
127dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandbool omx_time_stamp_reorder::insert_timestamp(OMX_BUFFERHEADERTYPE *header)
128dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
129dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	OMX_TICKS *table_entry = NULL;
130dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (!reorder_ts || error || !header) {
131dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (error || !header)
132dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			DEBUG("\n Invalid condition in insert_timestamp %p", header);
133dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return false;
134dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
135dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if(!get_current_list()) {
136dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		handle_error();
137dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return false;
138dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
139dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (pcurrent->entries_filled > (TIME_SZ - 1)) {
140dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		DEBUG("\n Table full return error");
141dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		handle_error();
142dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return false;
143dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
144dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (header->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
145dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return true;
146dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
147dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if ((header->nFlags & OMX_BUFFERFLAG_EOS) && !header->nFilledLen)
148dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	{
149dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		DEBUG("\n EOS with zero length recieved");
150dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (!add_new_list()) {
151dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			handle_error();
152dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			return false;
153dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
154dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return true;
155dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
156dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	for(int i = 0; i < TIME_SZ && !table_entry; i++) {
157dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (!pcurrent->input_timestamps[i].in_use) {
158dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			table_entry = &pcurrent->input_timestamps[i].timestamps;
159dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			pcurrent->input_timestamps[i].in_use = true;
160dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			pcurrent->entries_filled++;
161dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
162dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
163dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (!table_entry) {
164dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		DEBUG("\n All entries in use");
165dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		handle_error();
166dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return false;
167dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
168dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	*table_entry = header->nTimeStamp;
169dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand        if (print_debug)
170dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	        DEBUG("Time stamp inserted %lld", header->nTimeStamp);
171dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (header->nFlags & OMX_BUFFERFLAG_EOS) {
172dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (!add_new_list()) {
173dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			handle_error();
174dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			return false;
175dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
176dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
177dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	return true;
178dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
179dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
180dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandbool omx_time_stamp_reorder::remove_time_stamp(OMX_TICKS ts, bool is_interlaced = false)
181dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
182dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	unsigned int num_ent_remove = (is_interlaced)?2:1;
183dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (!reorder_ts || error) {
184dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		DEBUG("\n not in avi mode");
185dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return false;
186dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
187dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (!phead || !phead->entries_filled) return false;
188dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	for(int i=0; i < TIME_SZ && num_ent_remove; i++) {
189dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (phead->input_timestamps[i].in_use && phead->input_timestamps[i].timestamps == ts) {
190dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				phead->input_timestamps[i].in_use = false;
191dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				phead->entries_filled--;
192dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				num_ent_remove--;
193dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                                if (print_debug)
194dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		                       DEBUG("Removed TS %lld", ts);
195dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
196dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
197dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (!phead->entries_filled) {
198dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (!update_head()) {
199dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			handle_error();
200dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			return false;
201dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
202dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
203dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	return true;
204dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
205dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
206dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandvoid omx_time_stamp_reorder::flush_timestamp()
207dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
208dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	delete_list();
209dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
210dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
211dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchandbool omx_time_stamp_reorder::get_next_timestamp(OMX_BUFFERHEADERTYPE *header, bool is_interlaced)
212dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand{
213dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	timestamp *element = NULL,*duplicate = NULL;
214dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	bool status = false;
215dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (!reorder_ts || error || !header) {
216dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (error || !header)
217dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			DEBUG("\n Invalid condition in insert_timestamp %p", header);
218dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		return false;
219dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
220dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if(!phead || !phead->entries_filled) return false;
221dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	for(int i=0; i < TIME_SZ; i++) {
222dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (phead->input_timestamps[i].in_use) {
223dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			status = true;
224dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			if (!element)
225dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				element = &phead->input_timestamps[i];
226dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			else {
227dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				if (element->timestamps > phead->input_timestamps[i].timestamps){
228dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand					element = &phead->input_timestamps[i];
229dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand					duplicate = NULL;
230dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				} else if(element->timestamps == phead->input_timestamps[i].timestamps)
231dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand					duplicate = &phead->input_timestamps[i];
232dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			}
233dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
234dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
235dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (element) {
236dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		phead->entries_filled--;
237dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		header->nTimeStamp = element->timestamps;
238dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand                if (print_debug)
239dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		     DEBUG("Getnext Time stamp %lld", header->nTimeStamp);
240dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		element->in_use = false;
241dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
242dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if(is_interlaced && duplicate) {
243dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		phead->entries_filled--;
244dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		duplicate->in_use = false;
245dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
246dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	else if(is_interlaced && status)
247dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	{
248dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		for(int i=0; i < TIME_SZ; i++) {
249dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			if (phead->input_timestamps[i].in_use) {
250dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				if (!duplicate)
251dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand					duplicate = &phead->input_timestamps[i];
252dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				else {
253dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand					if (duplicate->timestamps > phead->input_timestamps[i].timestamps)
254dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand						duplicate = &phead->input_timestamps[i];
255dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				}
256dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			}
257dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
258dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (duplicate) {
259dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			phead->entries_filled--;
260dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			if (print_debug)
261dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand				DEBUG("Getnext Duplicate Time stamp %lld", header->nTimeStamp);
262dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			duplicate->in_use = false;
263dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
264dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
265dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand
266dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	if (!phead->entries_filled) {
267dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		if (!update_head()) {
268dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			handle_error();
269dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand			return false;
270dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand		}
271dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	}
272dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand	return status;
273dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand}
274