yading@10: /* yading@10: * Copyright (c) 2008 BBC, Anuradha Suraparaju yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: /** yading@10: * @file yading@10: * data structures common to libschroedinger decoder and encoder yading@10: */ yading@10: yading@10: #ifndef AVCODEC_LIBSCHROEDINGER_H yading@10: #define AVCODEC_LIBSCHROEDINGER_H yading@10: yading@10: #include yading@10: #include yading@10: yading@10: #include "avcodec.h" yading@10: yading@10: typedef struct SchroVideoFormatInfo { yading@10: uint16_t width; yading@10: uint16_t height; yading@10: uint16_t frame_rate_num; yading@10: uint16_t frame_rate_denom; yading@10: } SchroVideoFormatInfo; yading@10: yading@10: /** yading@10: * contains a single encoded frame returned from Dirac or Schroedinger yading@10: */ yading@10: typedef struct FFSchroEncodedFrame { yading@10: /** encoded frame data */ yading@10: uint8_t *p_encbuf; yading@10: yading@10: /** encoded frame size */ yading@10: uint32_t size; yading@10: yading@10: /** encoded frame number. Will be used as pts */ yading@10: uint32_t frame_num; yading@10: yading@10: /** key frame flag. 1 : is key frame , 0 : in not key frame */ yading@10: uint16_t key_frame; yading@10: } FFSchroEncodedFrame; yading@10: yading@10: /** yading@10: * queue element yading@10: */ yading@10: typedef struct FFSchroQueueElement { yading@10: /** Data to be stored in queue*/ yading@10: void *data; yading@10: /** Pointer to next element queue */ yading@10: struct FFSchroQueueElement *next; yading@10: } FFSchroQueueElement; yading@10: yading@10: yading@10: /** yading@10: * A simple queue implementation used in libschroedinger yading@10: */ yading@10: typedef struct FFSchroQueue { yading@10: /** Pointer to head of queue */ yading@10: FFSchroQueueElement *p_head; yading@10: /** Pointer to tail of queue */ yading@10: FFSchroQueueElement *p_tail; yading@10: /** Queue size*/ yading@10: int size; yading@10: } FFSchroQueue; yading@10: yading@10: /** yading@10: * Initialise the queue yading@10: */ yading@10: void ff_schro_queue_init(FFSchroQueue *queue); yading@10: yading@10: /** yading@10: * Add an element to the end of the queue yading@10: */ yading@10: int ff_schro_queue_push_back(FFSchroQueue *queue, void *p_data); yading@10: yading@10: /** yading@10: * Return the first element in the queue yading@10: */ yading@10: void *ff_schro_queue_pop(FFSchroQueue *queue); yading@10: yading@10: /** yading@10: * Free the queue resources. free_func is a function supplied by the caller to yading@10: * free any resources allocated by the caller. The data field of the queue yading@10: * element is passed to it. yading@10: */ yading@10: void ff_schro_queue_free(FFSchroQueue *queue, void (*free_func)(void *)); yading@10: yading@10: static const struct { yading@10: enum AVPixelFormat ff_pix_fmt; yading@10: SchroChromaFormat schro_pix_fmt; yading@10: SchroFrameFormat schro_frame_fmt; yading@10: } schro_pixel_format_map[] = { yading@10: { AV_PIX_FMT_YUV420P, SCHRO_CHROMA_420, SCHRO_FRAME_FORMAT_U8_420 }, yading@10: { AV_PIX_FMT_YUV422P, SCHRO_CHROMA_422, SCHRO_FRAME_FORMAT_U8_422 }, yading@10: { AV_PIX_FMT_YUV444P, SCHRO_CHROMA_444, SCHRO_FRAME_FORMAT_U8_444 }, yading@10: }; yading@10: yading@10: /** yading@10: * Returns the video format preset matching the input video dimensions and yading@10: * time base. yading@10: */ yading@10: SchroVideoFormatEnum ff_get_schro_video_format_preset (AVCodecContext *avctx); yading@10: yading@10: /** yading@10: * Sets the Schroedinger frame format corresponding to the Schro chroma format yading@10: * passed. Returns 0 on success, -1 on failure. yading@10: */ yading@10: int ff_get_schro_frame_format(SchroChromaFormat schro_chroma_fmt, yading@10: SchroFrameFormat *schro_frame_fmt); yading@10: yading@10: /** yading@10: * Create a Schro frame based on the dimensions and frame format yading@10: * passed. Returns a pointer to a frame on success, NULL on failure. yading@10: */ yading@10: SchroFrame *ff_create_schro_frame(AVCodecContext *avctx, yading@10: SchroFrameFormat schro_frame_fmt); yading@10: yading@10: #endif /* AVCODEC_LIBSCHROEDINGER_H */