2008-04-14 04:09:29 +00:00
|
|
|
|
/*
|
|
|
|
|
* 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
|
2008-06-14 16:05:00 +00:00
|
|
|
|
|
|
|
|
|
// Local Variables:
|
|
|
|
|
// tab-width: 8
|
|
|
|
|
// indent-tabs-mode: nil
|
|
|
|
|
// c-basic-offset: 2
|
|
|
|
|
// End:
|
|
|
|
|
// vim: set tabstop=8 shiftwidth=2 expandtab:
|