annotate stream/stream_live555.c @ 31139:9a2e299dc256

Add final missing bits of CineForm HD support on Linux (via the Windows DirectShow codec). Required changes: - codecs.conf entry (of course). - Allow opening files with ¡È.col¡É in the file name, just like ¡Èvp3¡É and ¡È.fpf¡É already was allowed. (CineForm expects to be able to do this, presumably for some color management code.) - In registry.c, fake a few registry keys that the codec expects the installer to have written. Also, change a few magic numbers (0, 2) to the appropriate constants (ERROR_SUCCESS, ERROR_FILE_NOT_FOUND) where appropriate, so the code is easier to follow. SMP works fine, but seemingly performs suboptimally (e.g., on my dual-core laptop, CineForm performs better if I lie to it and tell it I have four cores). I don't know if this is inherent in the codec, or some inefficiency in the emulated synchronization primitives.
author sesse
date Sun, 23 May 2010 16:01:12 +0000
parents ce19feeb5cbb
children 9494acd724a9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30426
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
1 /*
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
2 * This file is part of MPlayer.
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
3 *
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
5 * it under the terms of the GNU General Public License as published by
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
7 * (at your option) any later version.
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
8 *
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
12 * GNU General Public License for more details.
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
13 *
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
14 * You should have received a copy of the GNU General Public License along
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29889
diff changeset
17 */
27167
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
18
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
19 #include "config.h"
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
20
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
21 #include <unistd.h>
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
22 #include <stdlib.h>
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
23 #include <stdio.h>
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
24 #include <string.h>
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
25
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
26 #include "stream.h"
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
27 #include "network.h"
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
28 #include "libmpdemux/demuxer.h"
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
29 #include "help_mp.h"
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
30
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
31 extern int network_bandwidth;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
32
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
33 static int _rtsp_streaming_seek(int fd, off_t pos, streaming_ctrl_t* streaming_ctrl) {
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
34 return -1; // For now, we don't handle RTSP stream seeking
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
35 }
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
36
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
37 static int rtsp_streaming_start(stream_t* stream) {
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
38 stream->streaming_ctrl->streaming_seek = _rtsp_streaming_seek;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
39 return 0;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
40 }
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
41
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
42
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
43 static int open_live_rtsp_sip(stream_t *stream,int mode, void* opts, int* file_format) {
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
44 URL_t *url;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
45
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
46 stream->streaming_ctrl = streaming_ctrl_new();
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
47 if( stream->streaming_ctrl==NULL ) {
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
48 return STREAM_ERROR;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
49 }
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
50 stream->streaming_ctrl->bandwidth = network_bandwidth;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
51 url = url_new(stream->url);
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
52 stream->streaming_ctrl->url = check4proxies(url);
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
53 //url_free(url);
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
54
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
55 mp_msg(MSGT_OPEN, MSGL_INFO, "STREAM_LIVE555, URL: %s\n", stream->url);
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
56
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
57 if(rtsp_streaming_start(stream) < 0) {
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
58 mp_msg(MSGT_NETWORK,MSGL_ERR,"rtsp_streaming_start failed\n");
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
59 goto fail;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
60 }
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
61
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
62 *file_format = DEMUXER_TYPE_RTP;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
63 stream->type = STREAMTYPE_STREAM;
29889
031fd59bcb79 10l to Reimar: Fix typo.
cehoyos
parents: 29888
diff changeset
64 stream->flags = STREAM_NON_CACHEABLE;
27167
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
65 return STREAM_OK;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
66
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
67 fail:
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
68 streaming_ctrl_free( stream->streaming_ctrl );
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
69 stream->streaming_ctrl = NULL;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
70 return STREAM_ERROR;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
71 }
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
72
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
73 static int open_live_sdp(stream_t *stream,int mode, void* opts, int* file_format) {
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
74 int f;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
75 char *filename = stream->url;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
76 off_t len;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
77 char* sdpDescription;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
78 ssize_t numBytesRead;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
79
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
80 if(strncmp("sdp://",filename,6) == 0) {
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
81 filename += 6;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
82 f = open(filename,O_RDONLY|O_BINARY);
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
83 if(f < 0) {
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
84 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_FileNotFound,filename);
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
85 return STREAM_ERROR;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
86 }
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
87
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 27167
diff changeset
88 len=lseek(f,0,SEEK_END);
27167
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
89 lseek(f,0,SEEK_SET);
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
90 if(len == -1)
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
91 return STREAM_ERROR;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
92 if(len > SIZE_MAX - 1)
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
93 return STREAM_ERROR;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
94
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
95 sdpDescription = malloc(len+1);
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
96 if(sdpDescription == NULL) return STREAM_ERROR;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
97 numBytesRead = read(f, sdpDescription, len);
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
98 if(numBytesRead != len) {
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
99 free(sdpDescription);
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
100 return STREAM_ERROR;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
101 }
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
102 sdpDescription[len] = '\0'; // to be safe
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
103 stream->priv = sdpDescription;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
104
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
105 stream->type = STREAMTYPE_SDP;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
106 *file_format = DEMUXER_TYPE_RTP;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
107 return STREAM_OK;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
108 }
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
109 return STREAM_UNSUPPORTED;
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
110 }
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
111
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
112
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
113 const stream_info_t stream_info_rtsp_sip = {
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
114 "standard RTSP and SIP",
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
115 "RTSP and SIP",
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
116 "Ross Finlayson",
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
117 "Uses LIVE555 Streaming Media library.",
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
118 open_live_rtsp_sip,
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
119 {"rtsp", "sip", NULL },
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
120 NULL,
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
121 0 // Urls are an option string
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
122 };
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
123
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
124 const stream_info_t stream_info_sdp = {
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
125 "SDP stream descriptor",
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
126 "SDP",
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
127 "Ross Finlayson",
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
128 "Uses LIVE555 Streaming Media library.",
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
129 open_live_sdp,
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
130 {"sdp", NULL },
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
131 NULL,
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
132 0 // Urls are an option string
d9b61fc3c5b7 Rename stream_livedotcom.c to stream_live555.c, the name is used everywhere.
diego
parents:
diff changeset
133 };