F5OEO-tstools/filter_defns.h

114 wiersze
4.2 KiB
C

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

/*
* Datastructures for filtering ES data ("fast forward") and writing to ES or
* TS.
*
* ***** 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 _filter_defns
#define _filter_defns
#include "compat.h"
#include "es_defns.h"
#include "h262_defns.h"
#include "accessunit_defns.h"
#include "reverse_defns.h"
// Filtering comes in two varieties:
// - "stripping" means retaining just reference pictures. For H.262 this
// means the I pictures (and maybe the P pictures), for H.264 this means
// the IDR and I pictures (or maybe all reference pictures). This is simple
// to do, but the speedup resulting is very dependant on the data.
// - "filtering" means attempting to keep frames as a particular frequency,
// so, for instance, a frequency of 8 would mean trying to keep every 8th
// frame, or a speedup of 8x. This is harder to do as it depends rather
// crucially on the distribution of reference frames in the data.
// ------------------------------------------------------------
struct h262_filter_context
{
h262_context_p h262; // The H.262 stream we are reading from
int filter; // TRUE if filtering, FALSE if stripping
int freq; // Frequency of frames to try to keep if filtering
int allref; // Keep all I and P pictures if stripping?
// (the name `allref` is used for compatibility with the H.264 filter
// context - it's a little easier to have one name for both filters)
// For any operation on H.262, we want:
int pending_EOF; // next time a function is called, say we had EOF
// When filtering, we want:
int count; // a rolling count to compare with the desired frequency
int last_was_slice;
int had_previous_picture;
h262_picture_p last_seq_hdr;
// When stripping, we want:
int new_seq_hdr; // has the sequence header changed?
int frames_seen; // number of pictures seen this filter run
int frames_written; // number of pictures written (or, returned)
};
typedef struct h262_filter_context *h262_filter_context_p;
#define SIZEOF_H262_FILTER_CONTEXT sizeof(struct h262_filter_context)
// ------------------------------------------------------------
struct h264_filter_context
{
access_unit_context_p access_unit_context; // our "reader" for access units
int filter; // TRUE if filtering, FALSE if stripping
int freq; // Frequency of frames to try to keep if filtering
int allref; // Keep all reference pictures
// When filtering, we want:
// a rolling count to compare with the desired frequency
int count;
// `skipped_ref_pic` is TRUE if we've skipped any reference pictures
// since our last IDR.
int skipped_ref_pic;
// `last_accepted_was_not_IDR` is TRUE if the last frame kept (output)
// was not an IDR. We set it TRUE initially so that we will decide
// to output the first IDR we *do* find, regardless of the count.
int last_accepted_was_not_IDR;
int had_previous_access_unit;
// Have we had an IDR in this run of the filter?
int not_had_IDR;
int frames_seen; // number seen this filter run
int frames_written; // number written (or, returned)
};
typedef struct h264_filter_context *h264_filter_context_p;
#define SIZEOF_H264_FILTER_CONTEXT sizeof(struct h264_filter_context)
#endif // _filter_defns
// Local Variables:
// tab-width: 8
// indent-tabs-mode: nil
// c-basic-offset: 2
// End:
// vim: set tabstop=8 shiftwidth=2 expandtab: