F5OEO-tstools/avs_defns.h

140 wiersze
5.3 KiB
C
Czysty Zwykły widok Historia

/*
* Datastructures for reading AVS elementary streams.
*
* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the MPEG TS, PS and ES tools.
*
* The Initial Developer of the Original Code is Amino Communications Ltd.
* Portions created by the Initial Developer are Copyright (C) 2008
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Amino Communications Ltd, Swavesey, Cambridge UK
*
* ***** END LICENSE BLOCK *****
*/
#ifndef _avs_defns
#define _avs_defns
#include <stdio.h>
#include "compat.h"
#include "es_defns.h"
#include "ts_defns.h"
// Since reverse_data refers to avs and acces_unit datastructures, and
// *they* refer to reverse_data, we need to break the circular referencing
// at some point
typedef struct avs_context *avs_context_p;
#include "reverse_defns.h"
// ------------------------------------------------------------
// An AVS frame. This might be a picture or a sequence header (and
// its associated ES units).
struct _avs_frame
{
// The main thing we need is a list of the units that make up this picture
ES_unit_list_p list;
// An AVS "picture" might be a "proper" picture, a sequence header,
// or (just) a sequence end item. It's useful to be able to identify
// the two more common cases easily
int is_frame;
int is_sequence_header;
// It's also useful to remember what the first ES unit is
int start_code;
// Data defined for a frame.
byte picture_coding_type; // I, P or B (0, 1, 2)
byte picture_distance; // presentation order of P/B frames
// Data defined for a sequence header
byte aspect_ratio; // 1=SAR/1.0 2=4/3, 3=16/9, 4=2.21/1 (?)
byte frame_rate_code; // see Table 7-6
};
typedef struct _avs_frame *avs_frame_p;
#define SIZEOF_AVS_FRAME sizeof(struct _avs_frame)
// ------------------------------------------------------------
#define is_avs_slice_item(unit) ((unit)->start_code<0xB0)
#define is_avs_frame_item(unit) ((unit)->start_code==0xB3 || \
(unit)->start_code==0xB6)
#define is_avs_user_data_item(unit) ((unit)->start_code==0xB2)
#define is_avs_seq_header_item(unit) ((unit)->start_code==0xB0)
#define is_avs_seq_end_item(unit) ((unit)->start_code==0xB1)
#define is_avs_extension_start_item(unit) ((unit)->start_code==0xB5)
#define is_avs_video_edit_item(unit) ((unit)->start_code==0xB7)
#define avs_frame_rate(code) ((code)==1?24000.0/1001: /* 23.967... */\
(code)==2?24: \
(code)==3?25: \
(code)==4?30000.0/1001: /* 29.97... */ \
(code)==5?30: \
(code)==6?50: \
(code)==7?60000.0/1001: /* 59.94... */ \
(code)==8?60: \
25) /* Hmm-really an error */
#define AVS_I_PICTURE_CODING 0 // our invention, but reasonable in context
#define AVS_P_PICTURE_CODING 1
#define AVS_B_PICTURE_CODING 2
// Note that "I" is made up by us (there is no picture coding on I frames)
#define AVS_PICTURE_CODING_STR(s) \
((s)==AVS_I_PICTURE_CODING?"I": \
(s)==AVS_P_PICTURE_CODING?"P": \
(s)==AVS_B_PICTURE_CODING?"B": \
"Reserved")
// ------------------------------------------------------------
// Context for looping over the AVS items and pictures in an elementary
// stream
struct avs_context
{
ES_p es;
// We count all of the frames as we read them (this is useful
// when we are building up reverse_data arrays). If functions
// move around in the data stream, we assume that they will
// (re)set this to a sensible value.
// The index of the first frame read is 1, and this value is
// incremented by each call of `get_next_avs_frame` (note that
// for this purpose, sequence headers are *not* considered frames)
uint32_t frame_index; // The index of the last frame read
// We detect the end of an AVS frame (or sequence header) by
// reading the first item that cannot be part of it. We then need
// to remember that item for *next* time we try to read a frame.
ES_unit_p last_item;
// If we are collecting reversing information, then we keep a reference
// to the reverse data here
reverse_data_p reverse_data;
// In the same context, we need to remember how long it is since the
// last sequence header
byte count_since_seq_hdr;
};
#define SIZEOF_AVS_CONTEXT sizeof(struct avs_context)
#endif // _avs_defns
// Local Variables:
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 2
// End:
// vim: set tabstop=8 shiftwidth=2 expandtab: