Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
25410c52
Commit
25410c52
authored
Jul 25, 2015
by
Stephan Holljes
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
doc/example: Add http multi-client example code
Signed-off-by:
Stephan Holljes
<
klaxa1337@googlemail.com
>
parent
1d46e0ee
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
156 additions
and
0 deletions
+156
-0
Makefile
doc/examples/Makefile
+1
-0
http_multiclient.c
doc/examples/http_multiclient.c
+155
-0
No files found.
doc/examples/Makefile
View file @
25410c52
...
@@ -18,6 +18,7 @@ EXAMPLES= avio_list_dir \
...
@@ -18,6 +18,7 @@ EXAMPLES= avio_list_dir \
extract_mvs
\
extract_mvs
\
filtering_video
\
filtering_video
\
filtering_audio
\
filtering_audio
\
http_multiclient
\
metadata
\
metadata
\
muxing
\
muxing
\
remuxing
\
remuxing
\
...
...
doc/examples/http_multiclient.c
0 → 100644
View file @
25410c52
/*
* Copyright (c) 2015 Stephan Holljes
*
* 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.
*/
/**
* @file
* libavformat multi-client network API usage example.
*
* @example http_multiclient.c
* This example will serve a file without decoding or demuxing it over http.
* Multiple clients can connect and will receive the same file.
*/
#include <libavformat/avformat.h>
#include <libavutil/opt.h>
#include <unistd.h>
void
process_client
(
AVIOContext
*
client
,
const
char
*
in_uri
)
{
AVIOContext
*
input
=
NULL
;
uint8_t
buf
[
1024
];
int
ret
,
n
,
reply_code
;
char
*
resource
=
NULL
;
while
((
ret
=
avio_handshake
(
client
))
>
0
)
{
av_opt_get
(
client
,
"resource"
,
AV_OPT_SEARCH_CHILDREN
,
&
resource
);
// check for strlen(resource) is necessary, because av_opt_get()
// may return empty string.
if
(
resource
&&
strlen
(
resource
))
break
;
}
if
(
ret
<
0
)
goto
end
;
av_log
(
client
,
AV_LOG_TRACE
,
"resource=%p
\n
"
,
resource
);
if
(
resource
&&
resource
[
0
]
==
'/'
&&
!
strcmp
((
resource
+
1
),
in_uri
))
{
reply_code
=
200
;
}
else
{
reply_code
=
AVERROR_HTTP_NOT_FOUND
;
}
if
((
ret
=
av_opt_set_int
(
client
,
"reply_code"
,
reply_code
,
AV_OPT_SEARCH_CHILDREN
))
<
0
)
{
av_log
(
client
,
AV_LOG_ERROR
,
"Failed to set reply_code: %s.
\n
"
,
av_err2str
(
ret
));
goto
end
;
}
av_log
(
client
,
AV_LOG_TRACE
,
"Set reply code to %d
\n
"
,
reply_code
);
while
((
ret
=
avio_handshake
(
client
))
>
0
);
if
(
ret
<
0
)
goto
end
;
fprintf
(
stderr
,
"Handshake performed.
\n
"
);
if
(
reply_code
!=
200
)
goto
end
;
fprintf
(
stderr
,
"Opening input file.
\n
"
);
if
((
ret
=
avio_open2
(
&
input
,
in_uri
,
AVIO_FLAG_READ
,
NULL
,
NULL
))
<
0
)
{
av_log
(
input
,
AV_LOG_ERROR
,
"Failed to open input: %s: %s.
\n
"
,
in_uri
,
av_err2str
(
ret
));
goto
end
;
}
for
(;;)
{
n
=
avio_read
(
input
,
buf
,
sizeof
(
buf
));
if
(
n
<
0
)
{
if
(
n
==
AVERROR_EOF
)
break
;
av_log
(
input
,
AV_LOG_ERROR
,
"Error reading from input: %s.
\n
"
,
av_err2str
(
n
));
break
;
}
avio_write
(
client
,
buf
,
n
);
avio_flush
(
client
);
}
end:
fprintf
(
stderr
,
"Flushing client
\n
"
);
avio_flush
(
client
);
fprintf
(
stderr
,
"Closing client
\n
"
);
avio_close
(
client
);
fprintf
(
stderr
,
"Closing input
\n
"
);
avio_close
(
input
);
}
int
main
(
int
argc
,
char
**
argv
)
{
av_log_set_level
(
AV_LOG_TRACE
);
AVDictionary
*
options
=
NULL
;
AVIOContext
*
client
=
NULL
,
*
server
=
NULL
;
const
char
*
in_uri
,
*
out_uri
;
int
ret
,
pid
;
if
(
argc
<
3
)
{
printf
(
"usage: %s input http://hostname[:port]
\n
"
"API example program to serve http to multiple clients.
\n
"
"
\n
"
,
argv
[
0
]);
return
1
;
}
in_uri
=
argv
[
1
];
out_uri
=
argv
[
2
];
av_register_all
();
avformat_network_init
();
if
((
ret
=
av_dict_set
(
&
options
,
"listen"
,
"2"
,
0
))
<
0
)
{
fprintf
(
stderr
,
"Failed to set listen mode for server: %s
\n
"
,
av_err2str
(
ret
));
return
ret
;
}
if
((
ret
=
avio_open2
(
&
server
,
out_uri
,
AVIO_FLAG_WRITE
,
NULL
,
&
options
))
<
0
)
{
fprintf
(
stderr
,
"Failed to open server: %s
\n
"
,
av_err2str
(
ret
));
return
ret
;
}
fprintf
(
stderr
,
"Entering main loop.
\n
"
);
for
(;;)
{
if
((
ret
=
avio_accept
(
server
,
&
client
))
<
0
)
goto
end
;
fprintf
(
stderr
,
"Accepted client, forking process.
\n
"
);
// XXX: Since we don't reap our children and don't ignore signals
// this produces zombie processes.
pid
=
fork
();
if
(
pid
<
0
)
{
perror
(
"Fork failed"
);
ret
=
AVERROR
(
errno
);
goto
end
;
}
if
(
pid
==
0
)
{
fprintf
(
stderr
,
"In child.
\n
"
);
process_client
(
client
,
in_uri
);
avio_close
(
server
);
exit
(
0
);
}
if
(
pid
>
0
)
avio_close
(
client
);
}
end:
avio_close
(
server
);
if
(
ret
<
0
&&
ret
!=
AVERROR_EOF
)
{
fprintf
(
stderr
,
"Some errors occured: %s
\n
"
,
av_err2str
(
ret
));
return
1
;
}
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment