/*
 * camswclient.h - GStreamer softcam client
 * Copyright (C) 2007 Alessandro Decina
 * 
 * Authors:
 *   Alessandro Decina <alessandro@nnva.org>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library 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
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef CAM_SW_CLIENT_H
#define CAM_SW_CLIENT_H

#include <glib.h>
#include "camutils.h"

typedef enum
{
  CAM_SW_CLIENT_STATE_CLOSED,
  CAM_SW_CLIENT_STATE_OPEN,
} CamSwClientState;

typedef struct
{
  /* private */
  CamSwClientState state;
  char *sock_path;
  int sock;

} CamSwClient;

CamSwClient *cam_sw_client_new (void);
void cam_sw_client_free (CamSwClient *sw_client);

gboolean cam_sw_client_open (CamSwClient *sw_client, const char *sock_path);
void cam_sw_client_close (CamSwClient *sw_client);

void cam_sw_client_set_pmt (CamSwClient *sw_client, GstMpegtsPMT *pmt);
void cam_sw_client_update_pmt (CamSwClient *sw_client, GstMpegtsPMT *pmt);

#endif /* CAM_SW_CLIENT_H */
