Files
nvgstapps/nvgstapps_src/nvgst_sample_apps/nvgstplayer-1.0/nvgstplayer.h
svcmobrel-release 554cdfd85f Updating prebuilts and/or headers
6913ed4a984b2247d1373f0e1b395c582fefb2bd - nvgstapps_src/nvgst_sample_apps/nvgstipctestapp-1.0/LICENSE
bead485f1fb0d1861545916d7fb63d633c9ec872 - nvgstapps_src/nvgst_sample_apps/nvgstipctestapp-1.0/nvgstipctestapp.c
7152d9928416f55c6879ec0170a495f71eabf80d - nvgstapps_src/nvgst_sample_apps/nvgstipctestapp-1.0/Makefile.public
582a142d1a3098aed3bb4c8f7329e8cdac7b0ed8 - nvgstapps_src/nvgst_sample_apps/nvgstplayer-1.0/nvgst_x11_common.c
d3dee823127d19bcf050cb35c5e0962e9130d789 - nvgstapps_src/nvgst_sample_apps/nvgstplayer-1.0/nvgstplayer.c
c028fa403772288daf002520356e8e18cce5cb06 - nvgstapps_src/nvgst_sample_apps/nvgstplayer-1.0/nvgstplayer.h
aaafd7fd4c0214a52bf73dd2a0ba0af08c675b85 - nvgstapps_src/nvgst_sample_apps/nvgstplayer-1.0/nvgst_x11_common.h
33a285339d714d5546cddb92a710e418853470aa - nvgstapps_src/nvgst_sample_apps/nvgstplayer-1.0/nvgst_asound_common.c
6bafa48f47ad43d33ee446cf86f2b1da134f7868 - nvgstapps_src/nvgst_sample_apps/nvgstplayer-1.0/nvgst_asound_common.h
a5bdf6935960973677a005d9d28a04c023f5ec6f - nvgstapps_src/nvgst_sample_apps/nvgstcapture-1.0/nvgst_x11_common.c
bd149086ce2fd243a4f2ef669945ed673aa459b9 - nvgstapps_src/nvgst_sample_apps/nvgstcapture-1.0/nvgstcapture.h
ec4e84387d8e0e16529f7c8bcd7fee48c16c769c - nvgstapps_src/nvgst_sample_apps/nvgstcapture-1.0/nvgstcapture.c
87556b6e7da0ec3865546f10b7a58959cd8c6bfc - nvgstapps_src/nvgst_sample_apps/nvgstcapture-1.0/nvgst_x11_common.h

Change-Id: I8370c6e4de7d08081f8762b117676ada366bbc66
2024-05-02 11:24:57 -07:00

436 lines
15 KiB
C

/*
* Copyright (c) 2013-2019, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#ifndef __NVGSTPLAYER_H__
#define __NVGSTPLAYER_H__
#include <gst/gst.h>
#include <gst/video/videooverlay.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/time.h>
#include <stdlib.h>
#include <math.h>
#include <glib/gstdio.h>
#include <math.h>
#include <pthread.h>
#include <ctype.h>
#include <semaphore.h>
#include <errno.h>
#include "nvgst_x11_common.h"
#include "nvgst_asound_common.h"
#ifdef WITH_GUI
#include "nvgstplayer_gui_interface.h"
#else
gpointer dummy_func (void);
gpointer
dummy_func ()
{
return NULL;
}
#define GUI 0
#define CALL_GUI_FUNC(func, ...) dummy_func()
#define GET_GUI_CTX() NULL
#define GUI_CALLBACKS "nvgstplayer.h"
#endif
#define APPLICATION_NAME "nvgstplayer"
#define NVSTARTPER "startper"
#define NVSTART "start"
#define NVDURATION "duration"
#define NVCXPR "cxpr"
#define NVREPEATS "repeats"
#define NVAUDIO "audio"
#define NVVIDEO "video"
#define NVNATIVE_AUDIO "native_audio"
#define NVNATIVE_VIDEO "native_video"
#define NVNOP "nop"
#define NVSYNC "sync"
#define NVUSE_BUFFERING "use_buffering"
#define NVLOW_PERCENT "low_percent"
#define NVHIGH_PERCENT "high_percent"
#define NVMAX_SIZE_TIME "max_size_time"
#define NVMAX_SIZE_BYTES "max_size_bytes"
#define NVMAX_SIZE_BUFFERS "max_size_buffers"
#define NVIMAGE_DISPLAY_TIME "image_display_time"
#define NVTAGS "tags"
#define NVGST_AUDIO_DEC "sad"
#define NVGST_VIDEO_DEC "svd"
#define NVGST_AUDIO_CONV "sac"
#define NVGST_VIDEO_CONV "svc"
#define NVGST_AUDIO_SINK "sas"
#define NVGST_VIDEO_SINK "svs"
#define NVGST_FILE_SRC "sfsrc"
#define NVGST_RTSP_SRC "srtsp"
#define NVGST_HTTP_SRC "shttp"
#define NVGST_UDP_SRC "sudp"
#define NVGST_DEFAULT_AUDIO_CONV "audioconvert ! audioresample"
#define NVGST_DEFAULT_VIDEO_CONV "nvvidconv"
#define NVGST_DEFAULT_AUDIO_SINK "alsasink"
#define NVGST_DEFAULT_VIDEO_SINK "nv3dsink"
#define NVGST_DEFAULT_VIDEO_DEC "nvv4l2decoder"
#define NVGST_DEFAULT_FILE_SRC "filesrc"
#define NVGST_DEFAULT_RTSP_SRC "rtspsrc"
#define NVGST_DEFAULT_HTTP_SRC "souphttpsrc"
#define NVGST_DEFAULT_UDP_SRC "udpsrc"
#ifdef NVGST_LOG_LEVEL_DEBUG
#define NVGST_ENTER_FUNCTION() g_print("%s{", __FUNCTION__)
#define NVGST_EXIT_FUNCTION() g_print("%s}", __FUNCTION__)
#define NVGST_EXIT_FUNCTION_VIA(s) g_print("%s}['%s']", __FUNCTION__, s)
#define NVGST_DEBUG_MESSAGE(s) g_debug("<%s:%d> "s, __FUNCTION__, __LINE__)
#define NVGST_DEBUG_MESSAGE_V(s, ...) g_debug("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__)
#define NVGST_INFO_MESSAGE(s) g_message("<%s:%d> "s, __FUNCTION__, __LINE__)
#define NVGST_INFO_MESSAGE_V(s, ...) g_message("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__)
#define NVGST_WARNING_MESSAGE(s) g_warning("<%s:%d> "s, __FUNCTION__, __LINE__)
#define NVGST_WARNING_MESSAGE_V(s, ...) g_warning("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__)
#define NVGST_CRITICAL_MESSAGE(s) do {\
g_critical("<%s:%d> "s, __FUNCTION__, __LINE__);\
app->return_value = -1;\
} while (0)
#define NVGST_CRITICAL_MESSAGE_V(s, ...) do {\
g_critical("<%s:%d> "s, __FUNCTION__, __LINE__,__VA_ARGS__);\
app->return_value = -1;\
} while (0)
#define NVGST_ERROR_MESSAGE(s) g_error("<%s:%d> "s, __FUNCTION__, __LINE__)
#define NVGST_ERROR_MESSAGE_V(s, ...) g_error("<%s:%d> "s, __FUNCTION__, __LINE__,__VA_ARGS__)
#elif defined NVGST_LOG_LEVEL_INFO
#define NVGST_ENTER_FUNCTION() G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_EXIT_FUNCTION() G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_EXIT_FUNCTION_VIA(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_DEBUG_MESSAGE(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_DEBUG_MESSAGE_V(s, ...) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_INFO_MESSAGE(s) g_message("<%s:%d> "s, __FUNCTION__, __LINE__)
#define NVGST_INFO_MESSAGE_V(s, ...) g_message("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__)
#define NVGST_WARNING_MESSAGE(s) g_warning("<%s:%d> "s, __FUNCTION__, __LINE__)
#define NVGST_WARNING_MESSAGE_V(s, ...) g_warning("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__)
#define NVGST_CRITICAL_MESSAGE(s) do {\
g_critical("<%s:%d> "s, __FUNCTION__, __LINE__);\
app->return_value = -1;\
} while (0)
#define NVGST_CRITICAL_MESSAGE_V(s, ...) do {\
g_critical("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__);\
app->return_value = -1;\
} while (0)
#define NVGST_ERROR_MESSAGE(s) g_error("<%s:%d> "s, __FUNCTION__, __LINE__)
#define NVGST_ERROR_MESSAGE_V(s, ...) g_error("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__)
#elif defined NVGST_LOG_LEVEL_WARNING
#define NVGST_ENTER_FUNCTION() G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_EXIT_FUNCTION() G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_EXIT_FUNCTION_VIA(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_DEBUG_MESSAGE(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_DEBUG_MESSAGE_V(s, ...) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_INFO_MESSAGE(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_INFO_MESSAGE_V(s, ...) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_WARNING_MESSAGE(s) g_warning("<%s:%d> "s, __FUNCTION__, __LINE__)
#define NVGST_WARNING_MESSAGE_V(s, ...) g_warning("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__)
#define NVGST_CRITICAL_MESSAGE(s) do {\
g_critical("<%s:%d> "s, __FUNCTION__, __LINE__);\
app->return_value = -1;\
} while (0)
#define NVGST_CRITICAL_MESSAGE_V(s, ...) do {\
g_critical("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__);\
app->return_value = -1;\
} while (0)
#define NVGST_ERROR_MESSAGE(s) g_error("<%s:%d> "s, __FUNCTION__, __LINE__)
#define NVGST_ERROR_MESSAGE_V(s, ...) g_error("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__)
#elif defined NVGST_LOG_LEVEL_CRITICAL
#define NVGST_ENTER_FUNCTION() G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_EXIT_FUNCTION() G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_EXIT_FUNCTION_VIA(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_DEBUG_MESSAGE(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_DEBUG_MESSAGE_V(s, ...) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_INFO_MESSAGE(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_INFO_MESSAGE_V(s, ...) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_WARNING_MESSAGE(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_WARNING_MESSAGE_V(s, ...) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_CRITICAL_MESSAGE(s) do {\
g_critical("<%s:%d> "s, __FUNCTION__, __LINE__);\
app->return_value = -1;\
} while (0)
#define NVGST_CRITICAL_MESSAGE_V(s, ...) do {\
g_critical("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__);\
app->return_value = -1;\
} while (0)
#define NVGST_ERROR_MESSAGE(s) g_error("<%s:%d> "s, __FUNCTION__, __LINE__)
#define NVGST_ERROR_MESSAGE_V(s, ...) g_error("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__)
#else
#define NVGST_ENTER_FUNCTION() G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_EXIT_FUNCTION() G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_EXIT_FUNCTION_VIA(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_DEBUG_MESSAGE(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_DEBUG_MESSAGE_V(s, ...) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_INFO_MESSAGE(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_INFO_MESSAGE_V(s, ...) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_WARNING_MESSAGE(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_WARNING_MESSAGE_V(s, ...) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_CRITICAL_MESSAGE(s) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_CRITICAL_MESSAGE_V(s, ...) G_STMT_START{ (void)0; }G_STMT_END
#define NVGST_ERROR_MESSAGE(s) g_error("<%s:%d> "s, __FUNCTION__, __LINE__)
#define NVGST_ERROR_MESSAGE_V(s, ...) g_error("<%s:%d> "s, __FUNCTION__, __LINE__, __VA_ARGS__)
#endif
#define INITIAL_FPS_UPDATE_INTERVAL_MS 400
#ifdef WITH_GUI
#define DEFAULT_FPS_UPDATE_INTERVAL_MS 400
#else
#define DEFAULT_FPS_UPDATE_INTERVAL_MS 5000
#endif
#define CALC_RUNNING_AVERAGE(avg,val,size) (((val) + ((size)-1) * (avg)) / (size))
typedef enum
{
NVGST_RET_ASYNC = 1,
NVGST_RET_SUCCESS = 0,
NVGST_RET_ERR = -1,
NVGST_RET_END = -2,
NVGST_RET_INVALID = -3
} NvGstReturn;
typedef enum
{
NVGST_AUTOPLUG_SELECT_TRY = 0,
NVGST_AUTOPLUG_SELECT_EXPOSE,
NVGST_AUTOPLUG_SELECT_SKIP
} NvGstAutoplugSelectResult;
typedef enum
{
NVGST_PLAY_FLAG_VIDEO = (1 << 0),
NVGST_PLAY_FLAG_AUDIO = (1 << 1),
NVGST_PLAY_FLAG_TEXT = (1 << 2),
NVGST_PLAY_FLAG_VIS = (1 << 3),
NVGST_PLAY_FLAG_SOFT_VOLUME = (1 << 4),
NVGST_PLAY_FLAG_NATIVE_AUDIO = (1 << 5),
NVGST_PLAY_FLAG_NATIVE_VIDEO = (1 << 6),
NVGST_PLAY_FLAG_DOWNLOAD = (1 << 7),
NVGST_PLAY_FLAG_BUFFERING = (1 << 8),
NVGST_PLAY_FLAG_DEINTERLACE = (1 << 9),
/* added */
NVGST_PLAY_FLAG_PLAYBIN = (1 << 10)
} NvGstPlayFlags;
typedef enum
{
NVGST_OPS_NONE,
NVGST_OPS_PAUSE,
NVGST_OPS_PLAY,
NVGST_OPS_SEEK,
NVGST_OPS_WAIT,
NVGST_OPS_STOP
} NvGstOperation;
typedef enum
{
NVGST_CMD_NONE,
NVGST_CMD_SCRIPT,
NVGST_CMD_USER
} NvGstOpMode;
typedef enum
{
BUFFER_MODE_NONE = 0,
BUFFER_MODE_SLAVE = 1,
BUFFER_MODE_BUFFER = 2,
BUFFER_MODE_AUTO = 3
} JitterBufferMode;
typedef struct
{
gint repeats;
gboolean startPer;
GstClockTimeDiff segment_start;
GstClockTimeDiff segment_duration;
NvGstPlayFlags flags;
gboolean sync;
gboolean use_buffering;
gboolean disable_fullscreen;
gint low_percent;
gint high_percent;
gint aud_track;
gint vid_track;
gint drop_threshold_pct;
gboolean loop_forever;
gint max_size_buffers;
gint max_size_bytes;
GstClockTime max_size_time;
gint image_display_time;
gboolean show_tags;
GList *lplist_head;
GList *cmlist_head;
GList *lplist;
GList *cmlist;
} attrs_s;
typedef struct
{
gchar *uri;
NvGstOpMode operation_mode;
GstClockTimeDiff duration;
gchar **audio_dec;
gchar **video_dec;
attrs_s attrs;
gboolean selfexpr;
gboolean pending_play;
guint64 interval;
gboolean postpone;
gboolean dbin_audio_decoders;
gboolean dbin_video_decoders;
} inAttrs;
typedef struct
{
FILE *file;
guint frames_rendered, frames_dropped, frames_dropped_decoder;
guint64 last_frames_rendered, last_frames_dropped;
GstClockTime start_ts;
GstClockTime last_ts;
gdouble max_fps;
gdouble min_fps;
gdouble average_fps;
GTimer *timer;
guint dps_cb;
GstClockTime prev_ts;
GstClockTime avg_in_diff;
GstClockTime max_latency;
gboolean initial_fps;
} pfData_s;
typedef struct
{
inAttrs *input;
gchar *extra_options;
GKeyFile *pathCfg;
GKeyFile *elemCfg;
GHashTable *htable;
NvGstOperation cur_operation;
attrs_s attrs;
GstElement *pipeline;
GstElement *source;
GstElement *vpipe;
GstElement *apipe;
GstElement *vsink;
GstElement *asink;
GstElement *adbin;
GstElement *vdbin;
GstElement *seekElement;
gboolean no_more_pads;
gint cmd_id;
gint bus_id;
gint uriCount;
gsize uriTotal;
gchar **uriGroups;
gboolean version;
gboolean have_alsa_sinks;
gboolean found_demuxer;
gboolean got_eos;
gboolean is_live;
gboolean in_error;
gboolean pre_dbin_lp;
gboolean unpause;
gboolean buffering;
gboolean running;
guint image_eos;
gint return_value;
GstState target_state;
GstClockTimeDiff last_seek_time;
GstClockTimeDiff accum_time;
GstClockTime seekPos;
gchar *uri;
gchar **elem_gps;
gboolean stealth_mode;
gboolean bg_mode;
gchar *svd;
gchar *sad;
gchar *svc;
gchar *sac;
gchar *svs;
gchar *sas;
gchar *shttp;
gchar *srtsp;
gchar *sudp;
gchar *sfsrc;
gint astreams;
gint vstreams;
gint astream_select;
gint vstream_select;
gboolean disable_dpms;
displayCtx disp;
GThread *x_event_thread;
GMutex window_lock;
/* stats */
gboolean stats;
gchar *stats_file;
pfData_s pfData;
GstPad *vrender_pad;
GstPad *arender_pad;
gchar *elem_file;
GMutex dbin_lock;
} appCtx;
typedef struct
{
guint x;
guint n;
GList *c;
} sLp;
typedef struct
{
gchar *id;
GList *list;
} sCm;
#endif