/* * Blackmagic DeckLink common code * Copyright (c) 2013-2014 Ramiro Polla, Luca Barbato, Deti Fliegl * Copyright (c) 2017 Akamai Technologies, Inc. * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef AVDEVICE_DECKLINK_COMMON_H #define AVDEVICE_DECKLINK_COMMON_H #include #include "libavutil/thread.h" #include "decklink_common_c.h" class decklink_output_callback; class decklink_input_callback; typedef struct AVPacketQueue { AVPacketList *first_pkt, *last_pkt; int nb_packets; unsigned long long size; int abort_request; pthread_mutex_t mutex; pthread_cond_t cond; AVFormatContext *avctx; int64_t max_q_size; } AVPacketQueue; struct decklink_ctx { /* DeckLink SDK interfaces */ IDeckLink *dl; IDeckLinkOutput *dlo; IDeckLinkInput *dli; IDeckLinkConfiguration *cfg; IDeckLinkAttributes *attr; decklink_output_callback *output_callback; decklink_input_callback *input_callback; /* DeckLink mode information */ BMDTimeValue bmd_tb_den; BMDTimeValue bmd_tb_num; BMDDisplayMode bmd_mode; BMDVideoConnection video_input; BMDAudioConnection audio_input; int bmd_width; int bmd_height; int bmd_field_dominance; /* Capture buffer queue */ AVPacketQueue queue; /* Streams present */ int audio; int video; /* Status */ int playback_started; int capture_started; int64_t last_pts; unsigned long frameCount; unsigned int dropped; AVStream *audio_st; AVStream *video_st; AVStream *teletext_st; /* Options */ int list_devices; int list_formats; int64_t teletext_lines; double preroll; int duplex_mode; DecklinkPtsSource audio_pts_source; DecklinkPtsSource video_pts_source; int draw_bars; int frames_preroll; int frames_buffer; pthread_mutex_t mutex; pthread_cond_t cond; int frames_buffer_available_spots; int channels; }; typedef enum { DIRECTION_IN, DIRECTION_OUT} decklink_direction_t; #ifdef _WIN32 #if BLACKMAGIC_DECKLINK_API_VERSION < 0x0a040000 typedef unsigned long buffercount_type; #else typedef unsigned int buffercount_type; #endif IDeckLinkIterator *CreateDeckLinkIteratorInstance(void); #else typedef uint32_t buffercount_type; #endif static const BMDAudioConnection decklink_audio_connection_map[] = { (BMDAudioConnection)0, bmdAudioConnectionEmbedded, bmdAudioConnectionAESEBU, bmdAudioConnectionAnalog, bmdAudioConnectionAnalogXLR, bmdAudioConnectionAnalogRCA, bmdAudioConnectionMicrophone, }; static const BMDVideoConnection decklink_video_connection_map[] = { (BMDVideoConnection)0, bmdVideoConnectionSDI, bmdVideoConnectionHDMI, bmdVideoConnectionOpticalSDI, bmdVideoConnectionComponent, bmdVideoConnectionComposite, bmdVideoConnectionSVideo, }; HRESULT ff_decklink_get_display_name(IDeckLink *This, const char **displayName); int ff_decklink_set_format(AVFormatContext *avctx, int width, int height, int tb_num, int tb_den, enum AVFieldOrder field_order, decklink_direction_t direction = DIRECTION_OUT, int num = 0); int ff_decklink_set_format(AVFormatContext *avctx, decklink_direction_t direction, int num); int ff_decklink_list_devices(AVFormatContext *avctx, struct AVDeviceInfoList *device_list, int show_inputs, int show_outputs); void ff_decklink_list_devices_legacy(AVFormatContext *avctx, int show_inputs, int show_outputs); int ff_decklink_list_formats(AVFormatContext *avctx, decklink_direction_t direction = DIRECTION_OUT); void ff_decklink_cleanup(AVFormatContext *avctx); int ff_decklink_init_device(AVFormatContext *avctx, const char* name); #endif /* AVDEVICE_DECKLINK_COMMON_H */