summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/src/framebuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'debian/transcode/transcode-1.1.7/src/framebuffer.h')
-rw-r--r--debian/transcode/transcode-1.1.7/src/framebuffer.h499
1 files changed, 499 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/src/framebuffer.h b/debian/transcode/transcode-1.1.7/src/framebuffer.h
new file mode 100644
index 00000000..30528907
--- /dev/null
+++ b/debian/transcode/transcode-1.1.7/src/framebuffer.h
@@ -0,0 +1,499 @@
+/*
+ * framebuffer.h -- declarations of audio/video frame ringbuffers.
+ *
+ * Copyright (C) Thomas Oestreich - June 2001
+ * Updates and Enhancements
+ * (C) 2007-2010 - Francesco Romani <fromani -at- gmail -dot- com>
+ *
+ * This file is part of transcode, a video stream processing tool
+ *
+ * transcode is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * transcode 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+
+#ifndef FRAMEBUFFER_H
+#define FRAMEBUFFER_H
+
+#include <stdint.h>
+
+#include "libtc/tcframes.h"
+#include "tc_defaults.h"
+
+
+/*************************************************************************
+ * Transcode Framebuffer in a Nutshell (aka: how this code works)
+ * --------------------------------------------------------------
+ *
+ * Introduction:
+ * -------------
+ * This is a quick, terse overview of design principles beyond the
+ * framebuffer and about the design of this code. Full-blown
+ * documentation is avalaible under doc/.
+ *
+ * When reading framebuffer documentation/code, always take in mind
+ * the thread layout of transcode:
+ *
+ * - import layer is supposed to run 2 threads concurrently
+ * - filter layer is supposed to run 0..N threads concurrently
+ * - export layer is supposed to run 1 thread
+ *
+ * So, in any transcode execution, framebuffer code is supposed to
+ * serve from 3 to N+3 concurrent threads.
+ *
+ * Framebuffer entities:
+ * ---------------------
+ * XXX
+ *
+ * frame status transitions scheme (API reminder):
+ * -----------------------------------------------
+ *
+ * .---------<---------------<------+-------<------.
+ * V | 7 | 6
+ * .------------. .--------. .--------. .--------.
+ * | frame pool | --> | import | | filter | | export |
+ * `------------' 1 `--------' `--------' `--------'
+ * | A | A
+ * | 3 | | 4 |
+ * 2 | | V 5 |
+ * V .-------------. |
+ * `---->| frame chain |--->'
+ * `-------------'
+ *
+ * In frame lifetime order:
+ * 1. {a,v}frame_register (import)
+ * 2. {a,v}frame_push_next (import)
+ * 3. {a,v}frame_reserve (filter)
+ * 4. {a,v}frame_push_next (filter)
+ * 5. {a,v}frame_retrieve (export)
+ * 6. {a,v}frame_remove (export)
+ * [ 7. {a,v}frame_remove (filter) ]
+ *
+ * Operating conditions:
+ *
+ * 1. single source, full range, no interruptions
+ * 2. single source, full range, interruption
+ * 3. single source, sub range, no interruptions
+ * 4. single source, sub range, interruption
+ * 5. single source, multi sub ranges, no interruptions
+ * 5. single source, multi sub ranges, interruption
+ */
+
+
+/*
+ * frame*buffer* specifications, needed to properly allocate
+ * and initialize single frame buffers
+ */
+typedef struct tcframespecs_ TCFrameSpecs;
+struct tcframespecs_ {
+ int frc; /* frame ratio code is more precise than value */
+
+ /* video fields */
+ int width;
+ int height;
+ int format; /* TC_CODEC_reserve preferred,
+ * CODEC_reserve still supported for compatibility
+ */
+ /* audio fields */
+ int rate;
+ int channels;
+ int bits;
+
+ /* private field, used internally */
+ double samples;
+};
+
+/*
+ * tc_framebuffer_get_specs: (NOT thread safe)
+ * Get a pointer to a TCFrameSpecs structure representing current
+ * framebuffer structure. Frame handling code will use those parameters
+ * to allocate framebuffers.
+ *
+ * Parameters:
+ * None.
+ * Return Value:
+ * Constant pointer to a TCFrameSpecs structure. There is no need
+ * to *free() this structure.
+ */
+const TCFrameSpecs *tc_framebuffer_get_specs(void);
+
+/*
+ * tc_framebuffer_set_specs: (NOT thread safe)
+ * Setup new framebuffer parameters, to be used by internal framebuffer
+ * code to properly handle frame allocation.
+ * PLEASE NOTE that only allocation performed AFTER calling this function
+ * will use those parameters.
+ * PLEASE ALSO NOTE that is HIGHLY unsafe to mix allocation by changing
+ * TCFrameSpecs in between without freeing ringbuffers. Just DO NOT.
+ *
+ * Parameters:
+ * Constant pointer to a TCFrameSpecs holding new framebuffer parameters.
+ * Return Value:
+ * None.
+ */
+void tc_framebuffer_set_specs(const TCFrameSpecs *specs);
+
+/*
+ * tc_framebuffer_interrupt: (thread safe)
+ * Interrupt the framebuffer immediately (see below for specific meaning
+ * of this act in various functions).
+ * When framebuffer is interrupted, frames belonging to any processing
+ * stage are no longer avalaible; frame unavalaibility is notified as
+ * soon as is possible.
+ * When a framebuffer is interrupted, it becomes ready to be finalized;
+ * Effectively, the only operations that make sense to be performed on
+ * an interrupted framebuffer, is to finalize it.
+ * From statements above easily descend that interruption is irreversible.
+ *
+ * Parameters:
+ * None.
+ * Return Value:
+ * None.
+ * Side effects:
+ * Any frame-claiming function will fail after the invocation of this
+ * function (see description above).
+ */
+void tc_framebuffer_interrupt(void);
+void tc_framebuffer_interrupt_import(void);
+
+/*
+ * vframe_alloc, aframe_alloc: (NOT thread safe)
+ * Allocate respectively a video or audio frame ringbuffer capable to hold
+ * given amount of frames, with a minimum of one.
+ * Each framebuffer is allocated using TCFrameSpecs parameters.
+ * Use vframe_free/aframe_free to release acquired ringbuffers.
+ *
+ * Parameters:
+ * num: size of ringbuffer to allocate (number of framebuffers holded
+ * in ringbuffer).
+ * Return Value:
+ * 0: succesfull
+ * !0: error, tipically this means that one (or more) frame
+ * can't be allocated.
+ */
+int vframe_alloc(int num);
+int aframe_alloc(int num);
+
+/*
+ * vframe_alloc_single, aframe_alloc_single: (NOT thread safe)
+ * allocate a single framebuffer (respectively, video or audio)
+ * in compliacy with last TCFrameSpecs set.
+ * Those functione are mainly intended to provide a convenient
+ * way to encoder/decoder/whatelse to allocate private framebuffers
+ * without doing any size computation or waste memory.
+ * Returned value can be SAFELY deallocated using
+ * tc_del_video_frame or tc_del_audio_frame.
+ *
+ * Parameters:
+ * None.
+ * Return Value:
+ * respectively a pointer to a vframe_list_t or aframe_list_t,
+ * like, tc_new_video_frame() or tc_new_audio_frame() called
+ * with right parameters.
+ * NULL if allocation fails.
+ */
+vframe_list_t *vframe_alloc_single(void);
+aframe_list_t *aframe_alloc_single(void);
+
+/*
+ * vframe_free, aframe_free: (NOT thread safe)
+ * release all framebuffer memory acquired respect. for video and
+ * audio frame ringbuffers.
+ * Please remember thet ffter those functions called, almost
+ * all other ringbuffer functions will fail.
+ *
+ * Parameters:
+ * None.
+ * Return Value:
+ * None.
+ */
+void vframe_free(void);
+void aframe_free(void);
+
+/*
+ * vframe_flush, aframe_flush: (NOT thread safe)
+ * flush all framebuffers still in ringbuffer, by marking those as unused.
+ * This will reset ringbuffer to an empty state, ready to be (re)used again.
+ *
+ * Parameters:
+ * None.
+ * Return Value:
+ * None.
+ */
+void vframe_flush(void);
+void aframe_flush(void);
+
+/*
+ * tc_framebuffer_flush: (NOT thread safe)
+ * flush all active ringbuffers, and mark all frames as unused.
+ * This will reset ringbuffers to an empty state, ready to be (re)used again.
+ *
+ * Parameters:
+ * None.
+ * Return Value:
+ * None.
+ */
+void tc_framebuffer_flush(void);
+
+/*
+ * vframe_register, aframe_register: (thread safe)
+ * Frame claiming functions.
+ * Respectively wait for an empty audio and video frame,
+ * then register it in frame chain, attach the given `id'
+ * and finally return the pointer to caller.
+ *
+ * Those function are (and should be) used at the beginning
+ * of the frame chain. Those should are the first function
+ * that a framebuffer should see in it's lifecycle.
+ *
+ * In transcode, those functions are (and should be) used
+ * only in the decoder.
+ *
+ * Note:
+ * DO NOT *free() returned pointer! The memory needed for frames is
+ * handled by transcode internally.
+ *
+ * Parameters:
+ * id: set framebuffer id to this value.
+ * The meaning of `id' is enterely client-depended.
+ * Return Value:
+ * A valid pointer to respectively an empty video or audio frame.
+ * If framebuffer is interrupted, both returns NULL.
+ * Side effects:
+ * Being frame claiming functions, those functions will block
+ * calling thread until a new frame will be avalaible, OR
+ * until an interruption happens.
+ */
+vframe_list_t *vframe_register(int id);
+aframe_list_t *aframe_register(int id);
+
+/*
+ * vframe_reserve, aframe_reserve: (thread safe)
+ * Frame claiming functions.
+ * Respectively wait for a processing-needing
+ * (`waiting' in transcode slang) audio and video frame,
+ * then reserve it, preventing other calls to those functions
+ * to claim it twice, and finally return the pointer to caller.
+ *
+ * Those function are (and should be) used in the middle
+ * of the frame chain.
+ *
+ * In transcode, those functions are (and should be) used
+ * only in the filter layer.
+ *
+ * Note:
+ * DO NOT *free() returned pointer! The memory needed for frames is
+ * handled by transcode internally.
+ *
+ * Parameters:
+ * None.
+ * Return Value:
+ * A valid pointer to respectively an empty video or audio frame.
+ * If framebuffer is interrupted, both returns NULL.
+ * Side effects:
+ * Being frame claiming functions, those functions will block
+ * calling thread until a new frame will be avalaible, OR
+ * until an interruption happens.
+ */
+vframe_list_t *vframe_reserve(void);
+aframe_list_t *aframe_reserve(void);
+
+/*
+ * vframe_retrieve, aframe_retrieve: (thread safe)
+ * Frame claiming functions.
+ * Respectively wait for a audio and video frame ready to be
+ * encoded, then retrieve it, preventing other calls to those
+ * functions to claim it twice, and finally return the pointer
+ * to caller.
+ *
+ * Those function are (and should be) used at the end
+ * of the frame chain.
+ *
+ * In transcode, those functions are (and should be) used
+ * only in the encoder.
+ *
+ * Note:
+ * DO NOT *free() returned pointer! The memory needed for frames is
+ * handled by transcode internally.
+ *
+ * Parameters:
+ * None.
+ * Return Value:
+ * A valid pointer to respectively an empty video or audio frame.
+ * If framebuffer is interrupted, both returns NULL.
+ * Side effects:
+ * Being frame claiming functions, those functions will block
+ * calling thread until a new frame will be avalaible, OR
+ * until an interruption happens.
+ */
+vframe_list_t *vframe_retrieve(void);
+aframe_list_t *aframe_retrieve(void);
+
+/*
+ * vframe_remove, aframe_remove: (thread safe)
+ * Respectively release an audio or video frame,
+ * by marking it as unused and putting it back on the frame pool.
+ *
+ * Those function are (and should be) used at the end
+ * of the frame chain. Those should are the last function
+ * that a framebuffer should see in it's lifecycle.
+ *
+ * In transcode, those functions are (and should be) used
+ * only in the encoder.
+ *
+ * Parameters:
+ * ptr: framebuffer to release.
+ * Return Value:
+ * None.
+ */
+void vframe_remove(vframe_list_t *ptr);
+void aframe_remove(aframe_list_t *ptr);
+
+/*
+ * vframe_push_next, aframe_push_next: (thread safe)
+ * Push a frame into next processing stage, by changing
+ * its status.
+ * Those functions are used when a processing stage terminate
+ * its operations on a given frame and so it want to pass such
+ * frame to next stage.
+ *
+ * In transcode, those functions are (and should be) used
+ * in the decoder and in the filter stage.
+ *
+ * Parameters:
+ * ptr: framebuffer pointer to be updated.
+ * status: new framebuffer status (= stage).
+ * Return Value:
+ * None.
+ * Side effects:
+ * A blocked thread can (and it will likely) be awaken
+ * by this operation.
+ */
+void vframe_push_next(vframe_list_t *ptr, TCFrameStatus status);
+void aframe_push_next(aframe_list_t *ptr, TCFrameStatus status);
+
+/*
+ * vframe_dup, aframe_dup: (thread safe)
+ * Frame claiming functions.
+ * Duplicate given respectively video or audio framebuffer.
+ * New framebuffer will be a full (deep) copy of old one
+ * (see aframe_copy/vframe_copy documentation to learn about
+ * deep copy).
+ *
+ * Parameters:
+ * f: framebuffer to be copied.
+ * Return Value:
+ * A valid pointer to respectively duplicate video or audio frame.
+ * If framebuffer is interrupted, both returns NULL.
+ * Side Effects:
+ * Being frame claiming functions, those functions will block
+ * calling thread until a new frame will be avalaible, OR
+ * until an interruption happens.
+ */
+vframe_list_t *vframe_dup(vframe_list_t *f);
+aframe_list_t *aframe_dup(aframe_list_t *f);
+
+/*
+ * vframe_copy, aframe_copy (thread safe)
+ * perform a soft or optionally deep copy respectively of a
+ * video or audio framebuffer. A soft copy just copies metadata;
+ * #ifdef STATBUFFER
+ * soft copy also let the buffer pointers point to original frame
+ * buffers, so data isn't really copied around.
+ * #endif
+ * A deep copy just ac_memcpy()s buffer data from a frame to other
+ * one, so new frame will be an independent copy of old one.
+ *
+ * Parameters:
+ * dst: framebuffer which will hold te copied (meta)data.
+ * src: framebuffer to be copied.
+ * Mind the fact that when using softcopy real buffers will
+ * remain the ones of this frame
+ * copy_data: boolean flag. If 0, do softcopy; do deepcopy otherwise.
+ *
+ * Return Value:
+ * None.
+ */
+void vframe_copy(vframe_list_t *dst, const vframe_list_t *src, int copy_data);
+void aframe_copy(aframe_list_t *dst, const aframe_list_t *src, int copy_data);
+
+/*
+ * vframe_dump_status, aframe_dump_status: (NOT thread safe)
+ * tc_log* out current framebuffer ringbuffer internal status, e.g.
+ * counters for null/ready/empty/loacked frames) respectively for
+ * video and audio ringbuffers.
+ *
+ * THREAD SAFENESS WARNING:
+ * WRITEME
+ *
+ * Parameters:
+ * None.
+ * Return Value:
+ * None.
+ * Side effects:
+ * See THREAD SAFENESS WARNING above.
+ */
+void vframe_dump_status(void);
+void aframe_dump_status(void);
+
+/*
+ * vframe_have_more, aframe_have_more (thread safe):
+ * check if video/audio frame list is empty or not.
+ *
+ * Parameters:
+ * None.
+ * Return Value:
+ * !0 if frame list has at least one frame
+ * 0 otherwise
+ */
+int vframe_have_more(void);
+int aframe_have_more(void);
+
+/*
+ * {v,a}frame_get_counters (thead safe):
+ * get the number of frames currently hold in the processing layers,
+ * respectively for video and audio pipelines.
+ *
+ * Parameters:
+ * im: if not NULL, store here the number of frames
+ * hold by import layer.
+ * fl: if not NULL, store here the number of frames
+ * hold by filter layer.
+ * ex: if not NULL, store here the number of frames
+ * hold by export layer.
+ * Return Value:
+ * None.
+ */
+void vframe_get_counters(int *im, int *fl, int *ex);
+void aframe_get_counters(int *im, int *fl, int *ex);
+
+/*
+ * tc_framebuffer_get_counters (thread safe):
+ * get the total number of frames currently hold in the processing
+ * layers, by considering both video and audio pipelines.
+ *
+ * Parameters:
+ * im: if not NULL, store here the number of frames
+ * hold by import layer.
+ * fl: if not NULL, store here the number of frames
+ * hold by filter layer.
+ * ex: if not NULL, store here the number of frames
+ * hold by export layer.
+ * Return Value:
+ * None.
+ */
+void tc_framebuffer_get_counters(int *im, int *fl, int *ex);
+
+#endif /* FRAMEBUFFER_H */