view stream/stream_live555.c @ 29691:183ea012e25b

Change grow_array argument from void ** to void *, this avoids a aliasing violation (thus making gcc 4.4.x compile the code correctly) and allows to get rid of some casts at the expense of making the code less clear.
author reimar
date Wed, 30 Sep 2009 07:27:43 +0000
parents 0f1b5b68af32
children 5c39c41f38e8
line wrap: on
line source


#include "config.h"

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "stream.h"
#include "network.h"
#include "libmpdemux/demuxer.h"
#include "help_mp.h"

extern int network_bandwidth;

static int _rtsp_streaming_seek(int fd, off_t pos, streaming_ctrl_t* streaming_ctrl) {
  return -1; // For now, we don't handle RTSP stream seeking
}

static int rtsp_streaming_start(stream_t* stream) {
  stream->streaming_ctrl->streaming_seek = _rtsp_streaming_seek;
  return 0;
}


static int open_live_rtsp_sip(stream_t *stream,int mode, void* opts, int* file_format) {
  URL_t *url;

  stream->streaming_ctrl = streaming_ctrl_new();
  if( stream->streaming_ctrl==NULL ) {
    return STREAM_ERROR;
  }
  stream->streaming_ctrl->bandwidth = network_bandwidth;
  url = url_new(stream->url);
  stream->streaming_ctrl->url = check4proxies(url);
  //url_free(url);

  mp_msg(MSGT_OPEN, MSGL_INFO, "STREAM_LIVE555, URL: %s\n", stream->url);

  if(rtsp_streaming_start(stream) < 0) {
    mp_msg(MSGT_NETWORK,MSGL_ERR,"rtsp_streaming_start failed\n");
    goto fail;
  }

  *file_format = DEMUXER_TYPE_RTP;
  stream->type = STREAMTYPE_STREAM;
  return STREAM_OK;

fail:
  streaming_ctrl_free( stream->streaming_ctrl );
  stream->streaming_ctrl = NULL;
  return STREAM_ERROR;
}

static int open_live_sdp(stream_t *stream,int mode, void* opts, int* file_format) {
  int f;
  char *filename = stream->url;
  off_t len;
  char* sdpDescription;
  ssize_t numBytesRead;

  if(strncmp("sdp://",filename,6) == 0) {
    filename += 6;
#if defined(__CYGWIN__) || defined(__MINGW32__)
    f = open(filename,O_RDONLY|O_BINARY);
#else
    f = open(filename,O_RDONLY);
#endif
    if(f < 0) {
      mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_FileNotFound,filename);
      return STREAM_ERROR;
    }

    len=lseek(f,0,SEEK_END);
    lseek(f,0,SEEK_SET);
    if(len == -1)
      return STREAM_ERROR;
    if(len > SIZE_MAX - 1)
      return STREAM_ERROR;

    sdpDescription = malloc(len+1);
    if(sdpDescription == NULL) return STREAM_ERROR;
    numBytesRead = read(f, sdpDescription, len);
    if(numBytesRead != len) {
      free(sdpDescription);
      return STREAM_ERROR;
    }
    sdpDescription[len] = '\0'; // to be safe
    stream->priv = sdpDescription;

    stream->type = STREAMTYPE_SDP;
    *file_format = DEMUXER_TYPE_RTP;
    return STREAM_OK;
  }
  return STREAM_UNSUPPORTED;
}


const stream_info_t stream_info_rtsp_sip = {
  "standard RTSP and SIP",
  "RTSP and SIP",
  "Ross Finlayson",
  "Uses LIVE555 Streaming Media library.",
  open_live_rtsp_sip,
  {"rtsp", "sip", NULL },
  NULL,
  0 // Urls are an option string
};

const stream_info_t stream_info_sdp = {
  "SDP stream descriptor",
  "SDP",
  "Ross Finlayson",
  "Uses LIVE555 Streaming Media library.",
  open_live_sdp,
  {"sdp", NULL },
  NULL,
  0 // Urls are an option string
};