| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2008 BBC, Anuradha Suraparaju <asuraparaju at gmail dot com > | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This file is part of FFmpeg. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * FFmpeg is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							|  |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * FFmpeg is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License along with FFmpeg; if not, write to the Free Software | 
					
						
							|  |  |  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2010-04-20 14:45:34 +00:00
										 |  |  | * @file | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | * functions common to libdirac and libschroedinger | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-22 16:26:15 +00:00
										 |  |  | #include "libdirac_libschro.h"
 | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-30 13:19:50 +01:00
										 |  |  | static const DiracSchroVideoFormatInfo ff_dirac_schro_video_format_info[] = { | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  |     { 640,  480,  24000, 1001}, | 
					
						
							|  |  |  |     { 176,  120,  15000, 1001}, | 
					
						
							|  |  |  |     { 176,  144,  25,    2   }, | 
					
						
							|  |  |  |     { 352,  240,  15000, 1001}, | 
					
						
							|  |  |  |     { 352,  288,  25,    2   }, | 
					
						
							|  |  |  |     { 704,  480,  15000, 1001}, | 
					
						
							|  |  |  |     { 704,  576,  25,    2   }, | 
					
						
							|  |  |  |     { 720,  480,  30000, 1001}, | 
					
						
							|  |  |  |     { 720,  576,  25,    1   }, | 
					
						
							|  |  |  |     { 1280, 720,  60000, 1001}, | 
					
						
							|  |  |  |     { 1280, 720,  50,    1   }, | 
					
						
							|  |  |  |     { 1920, 1080, 30000, 1001}, | 
					
						
							|  |  |  |     { 1920, 1080, 25,    1   }, | 
					
						
							|  |  |  |     { 1920, 1080, 60000, 1001}, | 
					
						
							|  |  |  |     { 1920, 1080, 50,    1   }, | 
					
						
							|  |  |  |     { 2048, 1080, 24,    1   }, | 
					
						
							|  |  |  |     { 4096, 2160, 24,    1   }, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-15 11:42:15 +00:00
										 |  |  | unsigned int ff_dirac_schro_get_video_format_idx(AVCodecContext *avccontext) | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     unsigned int ret_idx = 0; | 
					
						
							|  |  |  |     unsigned int idx; | 
					
						
							|  |  |  |     unsigned int num_formats = sizeof(ff_dirac_schro_video_format_info) / | 
					
						
							|  |  |  |                                sizeof(ff_dirac_schro_video_format_info[0]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-15 11:42:15 +00:00
										 |  |  |     for (idx = 1; idx < num_formats; ++idx) { | 
					
						
							| 
									
										
										
										
											2011-10-30 13:19:50 +01:00
										 |  |  |         const DiracSchroVideoFormatInfo *vf = &ff_dirac_schro_video_format_info[idx]; | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  |         if (avccontext->width  == vf->width && | 
					
						
							| 
									
										
										
										
											2009-08-15 11:42:15 +00:00
										 |  |  |             avccontext->height == vf->height) { | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  |             ret_idx = idx; | 
					
						
							|  |  |  |             if (avccontext->time_base.den == vf->frame_rate_num && | 
					
						
							| 
									
										
										
										
											2009-08-15 11:12:47 +00:00
										 |  |  |                 avccontext->time_base.num == vf->frame_rate_denom) | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  |                 return idx; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return ret_idx; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-30 13:19:50 +01:00
										 |  |  | void ff_dirac_schro_queue_init(DiracSchroQueue *queue) | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     queue->p_head = queue->p_tail = NULL; | 
					
						
							| 
									
										
										
										
											2008-07-10 11:40:19 +00:00
										 |  |  |     queue->size = 0; | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-30 13:19:50 +01:00
										 |  |  | void ff_dirac_schro_queue_free(DiracSchroQueue *queue, | 
					
						
							| 
									
										
										
										
											2009-08-15 11:42:15 +00:00
										 |  |  |                                void (*free_func)(void *)) | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-08-15 11:12:47 +00:00
										 |  |  |     while (queue->p_head) | 
					
						
							| 
									
										
										
										
											2009-08-15 11:42:15 +00:00
										 |  |  |         free_func(ff_dirac_schro_queue_pop(queue)); | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-30 13:19:50 +01:00
										 |  |  | int ff_dirac_schro_queue_push_back(DiracSchroQueue *queue, void *p_data) | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-10-30 13:19:50 +01:00
										 |  |  |     DiracSchroQueueElement *p_new = av_mallocz(sizeof(DiracSchroQueueElement)); | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-15 11:02:50 +00:00
										 |  |  |     if (!p_new) | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  |         return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     p_new->data = p_data; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-15 11:02:50 +00:00
										 |  |  |     if (!queue->p_head) | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  |         queue->p_head = p_new; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         queue->p_tail->next = p_new; | 
					
						
							|  |  |  |     queue->p_tail = p_new; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-10 11:40:19 +00:00
										 |  |  |     ++queue->size; | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-30 13:19:50 +01:00
										 |  |  | void *ff_dirac_schro_queue_pop(DiracSchroQueue *queue) | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-10-30 13:19:50 +01:00
										 |  |  |     DiracSchroQueueElement *top = queue->p_head; | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-15 11:02:50 +00:00
										 |  |  |     if (top) { | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  |         void *data = top->data; | 
					
						
							|  |  |  |         queue->p_head = queue->p_head->next; | 
					
						
							| 
									
										
										
										
											2008-07-10 11:40:19 +00:00
										 |  |  |         --queue->size; | 
					
						
							| 
									
										
										
										
											2009-08-15 11:42:15 +00:00
										 |  |  |         av_freep(&top); | 
					
						
							| 
									
										
										
										
											2008-04-22 13:22:21 +00:00
										 |  |  |         return data; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } |