summaryrefslogtreecommitdiff
path: root/src/lib.h
blob: 26cb770d7777b79ebc6b824c825eee1522338b32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* License: LGPL-2.1
 * vim: set sts=2 sw=2 et : */

#ifndef _SST_LIB
#define _SST_LIB

#include <glib.h>
#include <gst/gst.h>
#include <libsoup/soup.h>

typedef struct _TranscodeServerCtx TranscodeServerCtx;
typedef struct _TranscodeClientCtx TranscodeClientCtx;

struct _TranscodeServerCtx {
  SoupMessage *msg;
  GstElement *pipeline;
  GstElement *appsrc;
  /* The pipeline status can be queried from the pipeline itself,
   * but it's probably better for branching to have it separately too */
  gboolean pipeline_is_playing;
  /* Set to TRUE when the incoming stream ends; let's us know if
   * we need to set the PUT response on EOS/ERROR on the pipeline */
  gboolean request_finished;

  /* List of client contexts */
  GList *clients;
  /* Reference to the parent context hash table */
  GHashTable *parent_ctx_table;
  /* Reference to the key in the parent hash table */
  char *path;
};

struct _TranscodeClientCtx {
  SoupMessage *msg;
  GstElement *appsink; /* We hold an extra ref to this */
  GstPad *ghostsinkpad;

  GMutex can_write_chunk;
  guint timeout_handler_id;
  guint seconds_since_write;
  /* The transcode server context; we don't hold a ref to this */
  TranscodeServerCtx *server_ctx;
};

void stp_cleanup_transcode_server_ctx (TranscodeServerCtx *ctx);
void stp_cleanup_transcode_client_ctx (TranscodeClientCtx *ctx);
void stp_close_client_ctx (TranscodeClientCtx *ctx);

gboolean stp_on_gst_bus_message (GstBus             *bus,
                                 GstMessage         *msg,
                                 TranscodeServerCtx *ctx);

gboolean stp_copy_chunk_to_fd (SoupBuffer *chunk,
                               int         fd);
gboolean stp_copy_fd_to_body (TranscodeClientCtx *ctx);
gboolean stp_fd_has_data_to_read (int fd);

GstBuffer* stp_get_streamheader_from_caps (GstCaps *caps);
GstBuffer* stp_get_gst_buffer (SoupBuffer *chunk);

#endif /* _SST_LIB */