
Recherche avancée
Médias (39)
-
Stereo master soundtrack
17 octobre 2011, par
Mis à jour : Octobre 2011
Langue : English
Type : Audio
-
ED-ME-5 1-DVD
11 octobre 2011, par
Mis à jour : Octobre 2011
Langue : English
Type : Audio
-
1,000,000
27 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Demon Seed
26 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
The Four of Us are Dying
26 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
-
Corona Radiata
26 septembre 2011, par
Mis à jour : Septembre 2011
Langue : English
Type : Audio
Autres articles (95)
-
Websites made with MediaSPIP
2 mai 2011, parThis page lists some websites based on MediaSPIP.
-
Creating farms of unique websites
13 avril 2011, parMediaSPIP platforms can be installed as a farm, with a single "core" hosted on a dedicated server and used by multiple websites.
This allows (among other things) : implementation costs to be shared between several different projects / individuals rapid deployment of multiple unique sites creation of groups of like-minded sites, making it possible to browse media in a more controlled and selective environment than the major "open" (...) -
Publier sur MédiaSpip
13 juin 2013Puis-je poster des contenus à partir d’une tablette Ipad ?
Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir
Sur d’autres sites (10931)
-
Do I need multiple video files in different resolutions to use MPEG DASH ?
2 février 2023, par Gentil AlysonI'm trying to use Django REST Framework to serve .mpd files. When the user uploads a video, the server creates the MPD and the chunk files. However, I can't seem to able to make it work. I've tried using python-ffmpeg-video-streaming, but the client which is using dash.js to play the video will get only one bitrate (480p). I've also tried running this command
'ffmpeg -i {self.file.path} -map 0 -map 0 -c:a aac -c:v libx264 -b:v:0 800k -b:v:1 300k -var_stream_map "v:0,name:800k v:1,name:300k" -f dash -dash_segment_type mp4 -single_file 1 {file_dir}/dash.mpd'
usingos.system
from Python, but then the player gets stuck at buffering.



<mpd xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" mediapresentationduration="PT2M30.5S" maxsegmentduration="PT5.0S" minbuffertime="PT16.6S">
 <programinformation>
 </programinformation>
 <servicedescription>
 </servicedescription>
 <period start="PT0.0S">
 <adaptationset contenttype="video" startwithsap="1" segmentalignment="true" bitstreamswitching="true" framerate="30000/1001" maxwidth="1280" maxheight="720" par="16:9" lang="und">
 <representation mimetype="video/mp4" codecs="avc1.64001f" bandwidth="800000" width="1280" height="720" sar="1:1">
 <baseurl>dash-stream0.mp4</baseurl>
 <segmentlist timescale="1000000" duration="5000000" startnumber="1">
 <initialization range="0-854"></initialization>
 <segmenturl mediarange="855-190364" indexrange="855-906"></segmenturl>
 <segmenturl mediarange="190365-448322" indexrange="190365-190416"></segmenturl>
 <segmenturl mediarange="448323-628609" indexrange="448323-448374"></segmenturl>
 <segmenturl mediarange="628610-741660" indexrange="628610-628661"></segmenturl>
 <segmenturl mediarange="741661-1149015" indexrange="741661-741712"></segmenturl>
 <segmenturl mediarange="1149016-1761260" indexrange="1149016-1149067"></segmenturl>
 <segmenturl mediarange="1761261-1829636" indexrange="1761261-1761312"></segmenturl>
 <segmenturl mediarange="1829637-2343368" indexrange="1829637-1829688"></segmenturl>
 <segmenturl mediarange="2343369-2759155" indexrange="2343369-2343420"></segmenturl>
 <segmenturl mediarange="2759156-3120911" indexrange="2759156-2759207"></segmenturl>
 <segmenturl mediarange="3120912-3255416" indexrange="3120912-3120963"></segmenturl>
 <segmenturl mediarange="3255417-3617692" indexrange="3255417-3255468"></segmenturl>
 <segmenturl mediarange="3617693-3910773" indexrange="3617693-3617744"></segmenturl>
 <segmenturl mediarange="3910774-4097693" indexrange="3910774-3910825"></segmenturl>
 <segmenturl mediarange="4097694-4266685" indexrange="4097694-4097745"></segmenturl>
 <segmenturl mediarange="4266686-4609479" indexrange="4266686-4266737"></segmenturl>
 <segmenturl mediarange="4609480-4719699" indexrange="4609480-4609531"></segmenturl>
 <segmenturl mediarange="4719700-4833193" indexrange="4719700-4719751"></segmenturl>
 <segmenturl mediarange="4833194-4905000" indexrange="4833194-4833245"></segmenturl>
 <segmenturl mediarange="4905001-5046627" indexrange="4905001-4905052"></segmenturl>
 </segmentlist>
 </representation>
 </adaptationset>
 <adaptationset contenttype="audio" startwithsap="1" segmentalignment="true" bitstreamswitching="true" lang="eng">
 <representation mimetype="audio/mp4" codecs="mp4a.40.2" bandwidth="128000" audiosamplingrate="44100">
 <audiochannelconfiguration schemeiduri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></audiochannelconfiguration>
 <baseurl>dash-stream1.mp4</baseurl>
 <segmentlist timescale="1000000" duration="5000000" startnumber="1">
 <initialization range="0-764"></initialization>
 <segmenturl mediarange="765-82409" indexrange="765-816"></segmenturl>
 <segmenturl mediarange="82410-163592" indexrange="82410-82461"></segmenturl>
 <segmenturl mediarange="163593-244493" indexrange="163593-163644"></segmenturl>
 <segmenturl mediarange="244494-325181" indexrange="244494-244545"></segmenturl>
 <segmenturl mediarange="325182-406218" indexrange="325182-325233"></segmenturl>
 <segmenturl mediarange="406219-487174" indexrange="406219-406270"></segmenturl>
 <segmenturl mediarange="487175-568100" indexrange="487175-487226"></segmenturl>
 <segmenturl mediarange="568101-649853" indexrange="568101-568152"></segmenturl>
 <segmenturl mediarange="649854-732519" indexrange="649854-649905"></segmenturl>
 <segmenturl mediarange="732520-813751" indexrange="732520-732571"></segmenturl>
 <segmenturl mediarange="813752-895429" indexrange="813752-813803"></segmenturl>
 <segmenturl mediarange="895430-976537" indexrange="895430-895481"></segmenturl>
 <segmenturl mediarange="976538-1058579" indexrange="976538-976589"></segmenturl>
 <segmenturl mediarange="1058580-1139556" indexrange="1058580-1058631"></segmenturl>
 <segmenturl mediarange="1139557-1220802" indexrange="1139557-1139608"></segmenturl>
 <segmenturl mediarange="1220803-1301723" indexrange="1220803-1220854"></segmenturl>
 <segmenturl mediarange="1301724-1382546" indexrange="1301724-1301775"></segmenturl>
 <segmenturl mediarange="1382547-1464086" indexrange="1382547-1382598"></segmenturl>
 <segmenturl mediarange="1464087-1546573" indexrange="1464087-1464138"></segmenturl>
 <segmenturl mediarange="1546574-1627881" indexrange="1546574-1546625"></segmenturl>
 <segmenturl mediarange="1627882-1710185" indexrange="1627882-1627933"></segmenturl>
 <segmenturl mediarange="1710186-1791593" indexrange="1710186-1710237"></segmenturl>
 <segmenturl mediarange="1791594-1872889" indexrange="1791594-1791645"></segmenturl>
 <segmenturl mediarange="1872890-1954238" indexrange="1872890-1872941"></segmenturl>
 <segmenturl mediarange="1954239-2036069" indexrange="1954239-1954290"></segmenturl>
 <segmenturl mediarange="2036070-2117365" indexrange="2036070-2036121"></segmenturl>
 <segmenturl mediarange="2117366-2198435" indexrange="2117366-2117417"></segmenturl>
 <segmenturl mediarange="2198436-2279764" indexrange="2198436-2198487"></segmenturl>
 <segmenturl mediarange="2279765-2362061" indexrange="2279765-2279816"></segmenturl>
 <segmenturl mediarange="2362062-2443751" indexrange="2362062-2362113"></segmenturl>
 <segmenturl mediarange="2443752-2446358" indexrange="2443752-2443803"></segmenturl>
 </segmentlist>
 </representation>
 </adaptationset>
 <adaptationset contenttype="video" startwithsap="1" segmentalignment="true" bitstreamswitching="true" framerate="30000/1001" maxwidth="1280" maxheight="720" par="16:9" lang="und">
 <representation mimetype="video/mp4" codecs="avc1.64001f" bandwidth="300000" width="1280" height="720" sar="1:1">
 <baseurl>dash-stream2.mp4</baseurl>
 <segmentlist timescale="1000000" duration="5000000" startnumber="1">
 <initialization range="0-854"></initialization>
 <segmenturl mediarange="855-117134" indexrange="855-906"></segmenturl>
 <segmenturl mediarange="117135-288087" indexrange="117135-117186"></segmenturl>
 <segmenturl mediarange="288088-435178" indexrange="288088-288139"></segmenturl>
 <segmenturl mediarange="435179-520309" indexrange="435179-435230"></segmenturl>
 <segmenturl mediarange="520310-903223" indexrange="520310-520361"></segmenturl>
 <segmenturl mediarange="903224-1458808" indexrange="903224-903275"></segmenturl>
 <segmenturl mediarange="1458809-1524956" indexrange="1458809-1458860"></segmenturl>
 <segmenturl mediarange="1524957-2026894" indexrange="1524957-1525008"></segmenturl>
 <segmenturl mediarange="2026895-2406246" indexrange="2026895-2026946"></segmenturl>
 <segmenturl mediarange="2406247-2726266" indexrange="2406247-2406298"></segmenturl>
 <segmenturl mediarange="2726267-2852806" indexrange="2726267-2726318"></segmenturl>
 <segmenturl mediarange="2852807-3183174" indexrange="2852807-2852858"></segmenturl>
 <segmenturl mediarange="3183175-3467272" indexrange="3183175-3183226"></segmenturl>
 <segmenturl mediarange="3467273-3653219" indexrange="3467273-3467324"></segmenturl>
 <segmenturl mediarange="3653220-3821184" indexrange="3653220-3653271"></segmenturl>
 <segmenturl mediarange="3821185-4162978" indexrange="3821185-3821236"></segmenturl>
 <segmenturl mediarange="4162979-4273050" indexrange="4162979-4163030"></segmenturl>
 <segmenturl mediarange="4273051-4386223" indexrange="4273051-4273102"></segmenturl>
 <segmenturl mediarange="4386224-4458425" indexrange="4386224-4386275"></segmenturl>
 <segmenturl mediarange="4458426-4597502" indexrange="4458426-4458477"></segmenturl>
 </segmentlist>
 </representation>
 </adaptationset>
 <adaptationset contenttype="audio" startwithsap="1" segmentalignment="true" bitstreamswitching="true" lang="eng">
 <representation mimetype="audio/mp4" codecs="mp4a.40.2" bandwidth="128000" audiosamplingrate="44100">
 <audiochannelconfiguration schemeiduri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></audiochannelconfiguration>
 <baseurl>dash-stream3.mp4</baseurl>
 <segmentlist timescale="1000000" duration="5000000" startnumber="1">
 <initialization range="0-764"></initialization>
 <segmenturl mediarange="765-82409" indexrange="765-816"></segmenturl>
 <segmenturl mediarange="82410-163592" indexrange="82410-82461"></segmenturl>
 <segmenturl mediarange="163593-244493" indexrange="163593-163644"></segmenturl>
 <segmenturl mediarange="244494-325181" indexrange="244494-244545"></segmenturl>
 <segmenturl mediarange="325182-406218" indexrange="325182-325233"></segmenturl>
 <segmenturl mediarange="406219-487174" indexrange="406219-406270"></segmenturl>
 <segmenturl mediarange="487175-568100" indexrange="487175-487226"></segmenturl>
 <segmenturl mediarange="568101-649853" indexrange="568101-568152"></segmenturl>
 <segmenturl mediarange="649854-732519" indexrange="649854-649905"></segmenturl>
 <segmenturl mediarange="732520-813751" indexrange="732520-732571"></segmenturl>
 <segmenturl mediarange="813752-895429" indexrange="813752-813803"></segmenturl>
 <segmenturl mediarange="895430-976537" indexrange="895430-895481"></segmenturl>
 <segmenturl mediarange="976538-1058579" indexrange="976538-976589"></segmenturl>
 <segmenturl mediarange="1058580-1139556" indexrange="1058580-1058631"></segmenturl>
 <segmenturl mediarange="1139557-1220802" indexrange="1139557-1139608"></segmenturl>
 <segmenturl mediarange="1220803-1301723" indexrange="1220803-1220854"></segmenturl>
 <segmenturl mediarange="1301724-1382546" indexrange="1301724-1301775"></segmenturl>
 <segmenturl mediarange="1382547-1464086" indexrange="1382547-1382598"></segmenturl>
 <segmenturl mediarange="1464087-1546573" indexrange="1464087-1464138"></segmenturl>
 <segmenturl mediarange="1546574-1627881" indexrange="1546574-1546625"></segmenturl>
 <segmenturl mediarange="1627882-1710185" indexrange="1627882-1627933"></segmenturl>
 <segmenturl mediarange="1710186-1791593" indexrange="1710186-1710237"></segmenturl>
 <segmenturl mediarange="1791594-1872889" indexrange="1791594-1791645"></segmenturl>
 <segmenturl mediarange="1872890-1954238" indexrange="1872890-1872941"></segmenturl>
 <segmenturl mediarange="1954239-2036069" indexrange="1954239-1954290"></segmenturl>
 <segmenturl mediarange="2036070-2117365" indexrange="2036070-2036121"></segmenturl>
 <segmenturl mediarange="2117366-2198435" indexrange="2117366-2117417"></segmenturl>
 <segmenturl mediarange="2198436-2279764" indexrange="2198436-2198487"></segmenturl>
 <segmenturl mediarange="2279765-2362061" indexrange="2279765-2279816"></segmenturl>
 <segmenturl mediarange="2362062-2443751" indexrange="2362062-2362113"></segmenturl>
 <segmenturl mediarange="2443752-2446358" indexrange="2443752-2443803"></segmenturl>
 </segmentlist>
 </representation>
 </adaptationset>
 </period>
</mpd>





<mpd xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" mediapresentationduration="PT5M24.4S" maxsegmentduration="PT5.0S" minbuffertime="PT10.8S">
 <programinformation>
 </programinformation>
 <servicedescription>
 </servicedescription>
 <period start="PT0.0S">
 <adaptationset contenttype="video" startwithsap="1" segmentalignment="true" bitstreamswitching="true" framerate="30/1" maxwidth="854" maxheight="480" par="16:9" lang="und">
 <representation mimetype="video/mp4" codecs="avc1.64001f" bandwidth="750000" width="854" height="480" sar="1280:1281">
 <segmenttemplate timescale="15360" initialization="dash_init_$RepresentationID$.m4s" media="dash_chunk_$RepresentationID$_$Number%05d$.m4s" startnumber="1">
 <segmenttimeline>
 <s t="0" d="95744"></s>
 <s d="93696"></s>
 <s d="117760"></s>
 <s d="126976"></s>
 <s d="152064"></s>
 <s d="109056"></s>
 <s d="128000" r="1"></s>
 <s d="110080"></s>
 <s d="105984" r="1"></s>
 <s d="96256"></s>
 <s d="114688"></s>
 <s d="122880"></s>
 <s d="106496"></s>
 <s d="113152"></s>
 <s d="126464"></s>
 <s d="91136"></s>
 <s d="77824"></s>
 <s d="115712"></s>
 <s d="93184"></s>
 <s d="154624"></s>
 <s d="129024"></s>
 <s d="141824"></s>
 <s d="116736"></s>
 <s d="92672"></s>
 <s d="106496"></s>
 <s d="153088"></s>
 <s d="121344"></s>
 <s d="130560"></s>
 <s d="87040"></s>
 <s d="81920"></s>
 <s d="128000"></s>
 <s d="99328"></s>
 <s d="128000"></s>
 <s d="159232"></s>
 <s d="158208"></s>
 <s d="78848"></s>
 <s d="112640"></s>
 <s d="95232"></s>
 <s d="168448"></s>
 <s d="167424"></s>
 <s d="40960"></s>
 </segmenttimeline>
 </segmenttemplate>
 </representation>
 </adaptationset>
 <adaptationset contenttype="audio" startwithsap="1" segmentalignment="true" bitstreamswitching="true" lang="eng">
 <representation mimetype="audio/mp4" codecs="mp4a.40.2" bandwidth="192000" audiosamplingrate="44100">
 <audiochannelconfiguration schemeiduri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></audiochannelconfiguration>
 <segmenttemplate timescale="44100" initialization="dash_init_$RepresentationID$.m4s" media="dash_chunk_$RepresentationID$_$Number%05d$.m4s" startnumber="1">
 <segmenttimeline>
 <s t="0" d="220160"></s>
 <s d="221184" r="62"></s>
 <s d="151552"></s>
 </segmenttimeline>
 </segmenttemplate>
 </representation>
 </adaptationset>
 <adaptationset contenttype="video" startwithsap="1" segmentalignment="true" bitstreamswitching="true" framerate="30/1" maxwidth="1280" maxheight="720" par="16:9" lang="und">
 <representation mimetype="video/mp4" codecs="avc1.64001f" bandwidth="2048000" width="1280" height="720" sar="1:1">
 <segmenttemplate timescale="15360" initialization="dash_init_$RepresentationID$.m4s" media="dash_chunk_$RepresentationID$_$Number%05d$.m4s" startnumber="1">
 <segmenttimeline>
 <s t="0" d="96256"></s>
 <s d="93184"></s>
 <s d="117760"></s>
 <s d="78336"></s>
 <s d="106496"></s>
 <s d="123392"></s>
 <s d="80384"></s>
 <s d="128000" r="1"></s>
 <s d="109568"></s>
 <s d="164864"></s>
 <s d="128000"></s>
 <s d="181760"></s>
 <s d="91136"></s>
 <s d="84992"></s>
 <s d="127488"></s>
 <s d="103936"></s>
 <s d="101376"></s>
 <s d="77312"></s>
 <s d="115712"></s>
 <s d="93184"></s>
 <s d="154624"></s>
 <s d="129024"></s>
 <s d="132096"></s>
 <s d="126464"></s>
 <s d="92672"></s>
 <s d="107008"></s>
 <s d="152064"></s>
 <s d="122368"></s>
 <s d="130560"></s>
 <s d="85504"></s>
 <s d="82944"></s>
 <s d="128000"></s>
 <s d="99328"></s>
 <s d="128000"></s>
 <s d="161792"></s>
 <s d="155648"></s>
 <s d="78848"></s>
 <s d="113152"></s>
 <s d="119808"></s>
 <s d="144896"></s>
 <s d="116224"></s>
 <s d="83456"></s>
 <s d="7168"></s>
 </segmenttimeline>
 </segmenttemplate>
 </representation>
 </adaptationset>
 <adaptationset contenttype="audio" startwithsap="1" segmentalignment="true" bitstreamswitching="true" lang="eng">
 <representation mimetype="audio/mp4" codecs="mp4a.40.2" bandwidth="320000" audiosamplingrate="44100">
 <audiochannelconfiguration schemeiduri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></audiochannelconfiguration>
 <segmenttemplate timescale="44100" initialization="dash_init_$RepresentationID$.m4s" media="dash_chunk_$RepresentationID$_$Number%05d$.m4s" startnumber="1">
 <segmenttimeline>
 <s t="0" d="220160"></s>
 <s d="221184" r="62"></s>
 <s d="151552"></s>
 </segmenttimeline>
 </segmenttemplate>
 </representation>
 </adaptationset>
 <adaptationset contenttype="video" startwithsap="1" segmentalignment="true" bitstreamswitching="true" framerate="30/1" maxwidth="1920" maxheight="1080" par="16:9" lang="und">
 <representation mimetype="video/mp4" codecs="avc1.640028" bandwidth="4096000" width="1920" height="1080" sar="1:1">
 <segmenttemplate timescale="15360" initialization="dash_init_$RepresentationID$.m4s" media="dash_chunk_$RepresentationID$_$Number%05d$.m4s" startnumber="1">
 <segmenttimeline>
 <s t="0" d="86016"></s>
 <s d="103424"></s>
 <s d="95232"></s>
 <s d="95744"></s>
 <s d="111616"></s>
 <s d="123392"></s>
 <s d="80384"></s>
 <s d="128000" r="1"></s>
 <s d="109568"></s>
 <s d="157184"></s>
 <s d="92160"></s>
 <s d="145408"></s>
 <s d="79872"></s>
 <s d="85504"></s>
 <s d="92160"></s>
 <s d="82944"></s>
 <s d="81408"></s>
 <s d="168960"></s>
 <s d="138240"></s>
 <s d="83456"></s>
 <s d="99328"></s>
 <s d="120320"></s>
 <s d="126464"></s>
 <s d="132608"></s>
 <s d="121856"></s>
 <s d="96768"></s>
 <s d="90112"></s>
 <s d="169472"></s>
 <s d="121856"></s>
 <s d="137216"></s>
 <s d="119808"></s>
 <s d="177152"></s>
 <s d="92160"></s>
 <s d="128000"></s>
 <s d="161792"></s>
 <s d="156160"></s>
 <s d="78336"></s>
 <s d="77824"></s>
 <s d="84480"></s>
 <s d="104960"></s>
 <s d="110592"></s>
 <s d="98304"></s>
 <s d="108544"></s>
 </segmenttimeline>
 </segmenttemplate>
 </representation>
 </adaptationset>
 <adaptationset contenttype="audio" startwithsap="1" segmentalignment="true" bitstreamswitching="true" lang="eng">
 <representation mimetype="audio/mp4" codecs="mp4a.40.2" bandwidth="320000" audiosamplingrate="44100">
 <audiochannelconfiguration schemeiduri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"></audiochannelconfiguration>
 <segmenttemplate timescale="44100" initialization="dash_init_$RepresentationID$.m4s" media="dash_chunk_$RepresentationID$_$Number%05d$.m4s" startnumber="1">
 <segmenttimeline>
 <s t="0" d="220160"></s>
 <s d="221184" r="62"></s>
 <s d="151552"></s>
 </segmenttimeline>
 </segmenttemplate>
 </representation>
 </adaptationset>
 </period>
</mpd>



Do I really need multiple video files in different resolutions ? If not, then how would I go about making the necessary files ? Thanks in advance !


-
lavc/avcodec : improve AV_CODEC_FLAG_RECON_FRAME doxy
10 janvier 2023, par Anton Khirnov -
How can I fix a segmentation fault in a C program ? [duplicate]
31 mars 2023, par ipegasus

Possible Duplicate :

Segmentation fault



Currently I am upgrading an open source program used for HTTP streaming. It needs to support the latest FFmpeg.
The code compiles fine without any warnings, although I am getting a segmentation fault error.


How can I fix the issue ? And / or, what is the best way to debug ? Please find attached a portion of the code due to size. I will try to add the project to GitHub :)


Sample Usage


# segmenter --i out.ts --l 10 --o stream.m3u8 --d segments --f stream



Makefile


FFLIBS=`pkg-config --libs libavformat libavcodec libavutil`
FFFLAGS=`pkg-config --cflags libavformat libavcodec libavutil`

all:
 gcc -Wall -g segmenter.c -o segmenter ${FFFLAGS} ${FFLIBS}



segmenter.c


/*
 * Copyright (c) 2009 Chase Douglas
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
#include 
#include 
#include 
#include 
#include 
#include "libavformat/avformat.h"

#include "libavformat/avio.h"

#include <sys></sys>stat.h>

#include "segmenter.h"
#include "libavformat/avformat.h"

#define IMAGE_ID3_SIZE 9171

void printUsage() {
 fprintf(stderr, "\nExample: segmenter --i infile --d baseDir --f baseFileName --o playListFile.m3u8 --l 10 \n");
 fprintf(stderr, "\nOptions: \n");
 fprintf(stderr, "--i <infile>.\n");
 fprintf(stderr, "--o <outfile>.\n");
 fprintf(stderr, "--d basedir, the base directory for files.\n");
 fprintf(stderr, "--f baseFileName, output files will be baseFileName-#.\n");
 fprintf(stderr, "--l segment length, the length of each segment.\n");
 fprintf(stderr, "--a, audio only decode for < 64k streams.\n");
 fprintf(stderr, "--v, video only decode for < 64k streams.\n");
 fprintf(stderr, "--version, print version details and exit.\n");
 fprintf(stderr, "\n\n");
}

void ffmpeg_version() {
 // output build and version numbers
 fprintf(stderr, " libavutil version: %s\n", AV_STRINGIFY(LIBAVUTIL_VERSION));
 fprintf(stderr, " libavutil build: %d\n", LIBAVUTIL_BUILD);
 fprintf(stderr, " libavcodec version: %s\n", AV_STRINGIFY(LIBAVCODEC_VERSION));
 fprintf(stdout, " libavcodec build: %d\n", LIBAVCODEC_BUILD);
 fprintf(stderr, " libavformat version: %s\n", AV_STRINGIFY(LIBAVFORMAT_VERSION));
 fprintf(stderr, " libavformat build: %d\n", LIBAVFORMAT_BUILD);
 fprintf(stderr, " built on " __DATE__ " " __TIME__);
#ifdef __GNUC__
 fprintf(stderr, ", gcc: " __VERSION__ "\n");
#else
 fprintf(stderr, ", using a non-gcc compiler\n");
#endif
}


static AVStream *add_output_stream(AVFormatContext *output_format_context, AVStream *input_stream) {
 AVCodecContext *input_codec_context;
 AVCodecContext *output_codec_context;
 AVStream *output_stream;

 output_stream = avformat_new_stream(output_format_context, 0);
 if (!output_stream) {
 fprintf(stderr, "Segmenter error: Could not allocate stream\n");
 exit(1);
 }

 input_codec_context = input_stream->codec;
 output_codec_context = output_stream->codec;

 output_codec_context->codec_id = input_codec_context->codec_id;
 output_codec_context->codec_type = input_codec_context->codec_type;
 output_codec_context->codec_tag = input_codec_context->codec_tag;
 output_codec_context->bit_rate = input_codec_context->bit_rate;
 output_codec_context->extradata = input_codec_context->extradata;
 output_codec_context->extradata_size = input_codec_context->extradata_size;

 if (av_q2d(input_codec_context->time_base) * input_codec_context->ticks_per_frame > av_q2d(input_stream->time_base) && av_q2d(input_stream->time_base) < 1.0 / 1000) {
 output_codec_context->time_base = input_codec_context->time_base;
 output_codec_context->time_base.num *= input_codec_context->ticks_per_frame;
 } else {
 output_codec_context->time_base = input_stream->time_base;
 }

 switch (input_codec_context->codec_type) {
#ifdef USE_OLD_FFMPEG
 case CODEC_TYPE_AUDIO:
#else
 case AVMEDIA_TYPE_AUDIO:
#endif
 output_codec_context->channel_layout = input_codec_context->channel_layout;
 output_codec_context->sample_rate = input_codec_context->sample_rate;
 output_codec_context->channels = input_codec_context->channels;
 output_codec_context->frame_size = input_codec_context->frame_size;
 if ((input_codec_context->block_align == 1 && input_codec_context->codec_id == CODEC_ID_MP3) || input_codec_context->codec_id == CODEC_ID_AC3) {
 output_codec_context->block_align = 0;
 } else {
 output_codec_context->block_align = input_codec_context->block_align;
 }
 break;
#ifdef USE_OLD_FFMPEG
 case CODEC_TYPE_VIDEO:
#else
 case AVMEDIA_TYPE_VIDEO:
#endif
 output_codec_context->pix_fmt = input_codec_context->pix_fmt;
 output_codec_context->width = input_codec_context->width;
 output_codec_context->height = input_codec_context->height;
 output_codec_context->has_b_frames = input_codec_context->has_b_frames;

 if (output_format_context->oformat->flags & AVFMT_GLOBALHEADER) {
 output_codec_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
 }
 break;
 default:
 break;
 }

 return output_stream;
}

int write_index_file(const char index[], const char tmp_index[], const unsigned int planned_segment_duration, const unsigned int actual_segment_duration[],
 const char output_directory[], const char output_prefix[], const char output_file_extension[],
 const unsigned int first_segment, const unsigned int last_segment) {
 FILE *index_fp;
 char *write_buf;
 unsigned int i;

 index_fp = fopen(tmp_index, "w");
 if (!index_fp) {
 fprintf(stderr, "Could not open temporary m3u8 index file (%s), no index file will be created\n", tmp_index);
 return -1;
 }

 write_buf = malloc(sizeof (char) * 1024);
 if (!write_buf) {
 fprintf(stderr, "Could not allocate write buffer for index file, index file will be invalid\n");
 fclose(index_fp);
 return -1;
 }

 unsigned int maxDuration = planned_segment_duration;

 for (i = first_segment; i <= last_segment; i++)
 if (actual_segment_duration[i] > maxDuration)
 maxDuration = actual_segment_duration[i];



 snprintf(write_buf, 1024, "#EXTM3U\n#EXT-X-TARGETDURATION:%u\n", maxDuration);

 if (fwrite(write_buf, strlen(write_buf), 1, index_fp) != 1) {
 fprintf(stderr, "Could not write to m3u8 index file, will not continue writing to index file\n");
 free(write_buf);
 fclose(index_fp);
 return -1;
 }

 for (i = first_segment; i <= last_segment; i++) {
 snprintf(write_buf, 1024, "#EXTINF:%u,\n%s-%u%s\n", actual_segment_duration[i], output_prefix, i, output_file_extension);
 if (fwrite(write_buf, strlen(write_buf), 1, index_fp) != 1) {
 fprintf(stderr, "Could not write to m3u8 index file, will not continue writing to index file\n");
 free(write_buf);
 fclose(index_fp);
 return -1;
 }
 }

 snprintf(write_buf, 1024, "#EXT-X-ENDLIST\n");
 if (fwrite(write_buf, strlen(write_buf), 1, index_fp) != 1) {
 fprintf(stderr, "Could not write last file and endlist tag to m3u8 index file\n");
 free(write_buf);
 fclose(index_fp);
 return -1;
 }

 free(write_buf);
 fclose(index_fp);

 return rename(tmp_index, index);
}

int main(int argc, const char *argv[]) {
 //input parameters
 char inputFilename[MAX_FILENAME_LENGTH], playlistFilename[MAX_FILENAME_LENGTH], baseDirName[MAX_FILENAME_LENGTH], baseFileName[MAX_FILENAME_LENGTH];
 char baseFileExtension[5]; //either "ts", "aac" or "mp3"
 int segmentLength, outputStreams, verbosity, version;



 char currentOutputFileName[MAX_FILENAME_LENGTH];
 char tempPlaylistName[MAX_FILENAME_LENGTH];


 //these are used to determine the exact length of the current segment
 double prev_segment_time = 0;
 double segment_time;
 unsigned int actual_segment_durations[2048];
 double packet_time = 0;

 //new variables to keep track of output size
 double output_bytes = 0;

 unsigned int output_index = 1;
 AVOutputFormat *ofmt;
 AVFormatContext *ic = NULL;
 AVFormatContext *oc;
 AVStream *video_st = NULL;
 AVStream *audio_st = NULL;
 AVCodec *codec;
 int video_index;
 int audio_index;
 unsigned int first_segment = 1;
 unsigned int last_segment = 0;
 int write_index = 1;
 int decode_done;
 int ret;
 int i;

 unsigned char id3_tag[128];
 unsigned char * image_id3_tag;

 size_t id3_tag_size = 73;
 int newFile = 1; //a boolean value to flag when a new file needs id3 tag info in it

 if (parseCommandLine(inputFilename, playlistFilename, baseDirName, baseFileName, baseFileExtension, &outputStreams, &segmentLength, &verbosity, &version, argc, argv) != 0)
 return 0;

 if (version) {
 ffmpeg_version();
 return 0;
 }


 fprintf(stderr, "%s %s\n", playlistFilename, tempPlaylistName);


 image_id3_tag = malloc(IMAGE_ID3_SIZE);
 if (outputStreams == OUTPUT_STREAM_AUDIO)
 build_image_id3_tag(image_id3_tag);
 build_id3_tag((char *) id3_tag, id3_tag_size);

 snprintf(tempPlaylistName, strlen(playlistFilename) + strlen(baseDirName) + 1, "%s%s", baseDirName, playlistFilename);
 strncpy(playlistFilename, tempPlaylistName, strlen(tempPlaylistName));
 strncpy(tempPlaylistName, playlistFilename, MAX_FILENAME_LENGTH);
 strncat(tempPlaylistName, ".", 1);

 //decide if this is an aac file or a mpegts file.
 //postpone deciding format until later
 /* ifmt = av_find_input_format("mpegts");
 if (!ifmt)
 {
 fprintf(stderr, "Could not find MPEG-TS demuxer.\n");
 exit(1);
 } */

 av_log_set_level(AV_LOG_DEBUG);

 av_register_all();
 ret = avformat_open_input(&ic, inputFilename, NULL, NULL);
 if (ret != 0) {
 fprintf(stderr, "Could not open input file %s. Error %d.\n", inputFilename, ret);
 exit(1);
 }

 if (avformat_find_stream_info(ic, NULL) < 0) {
 fprintf(stderr, "Could not read stream information.\n");
 exit(1);
 }

 oc = avformat_alloc_context();
 if (!oc) {
 fprintf(stderr, "Could not allocate output context.");
 exit(1);
 }

 video_index = -1;
 audio_index = -1;

 for (i = 0; i < ic->nb_streams && (video_index < 0 || audio_index < 0); i++) {
 switch (ic->streams[i]->codec->codec_type) {

#ifdef USE_OLD_FFMPEG
 case CODEC_TYPE_VIDEO:
#else
 case AVMEDIA_TYPE_VIDEO:
#endif
 video_index = i;
 ic->streams[i]->discard = AVDISCARD_NONE;
 if (outputStreams & OUTPUT_STREAM_VIDEO)
 video_st = add_output_stream(oc, ic->streams[i]);
 break;
#ifdef USE_OLD_FFMPEG
 case CODEC_TYPE_AUDIO:
#else
 case AVMEDIA_TYPE_AUDIO:
#endif
 audio_index = i;
 ic->streams[i]->discard = AVDISCARD_NONE;
 if (outputStreams & OUTPUT_STREAM_AUDIO)
 audio_st = add_output_stream(oc, ic->streams[i]);
 break;
 default:
 ic->streams[i]->discard = AVDISCARD_ALL;
 break;
 }
 }

 if (video_index == -1) {
 fprintf(stderr, "Stream must have video component.\n");
 exit(1);
 }

 //now that we know the audio and video output streams
 //we can decide on an output format.
 if (outputStreams == OUTPUT_STREAM_AUDIO) {
 //the audio output format should be the same as the audio input format
 switch (ic->streams[audio_index]->codec->codec_id) {
 case CODEC_ID_MP3:
 fprintf(stderr, "Setting output audio to mp3.");
 strncpy(baseFileExtension, ".mp3", strlen(".mp3"));
 ofmt = av_guess_format("mp3", NULL, NULL);
 break;
 case CODEC_ID_AAC:
 fprintf(stderr, "Setting output audio to aac.");
 ofmt = av_guess_format("adts", NULL, NULL);
 break;
 default:
 fprintf(stderr, "Codec id %d not supported.\n", ic->streams[audio_index]->id);
 }
 if (!ofmt) {
 fprintf(stderr, "Could not find audio muxer.\n");
 exit(1);
 }
 } else {
 ofmt = av_guess_format("mpegts", NULL, NULL);
 if (!ofmt) {
 fprintf(stderr, "Could not find MPEG-TS muxer.\n");
 exit(1);
 }
 }
 oc->oformat = ofmt;

 if (outputStreams & OUTPUT_STREAM_VIDEO && oc->oformat->flags & AVFMT_GLOBALHEADER) {
 oc->flags |= CODEC_FLAG_GLOBAL_HEADER;
 }


 /* Deprecated: pass the options to avformat_write_header directly.
 if (av_set_parameters(oc, NULL) < 0) {
 fprintf(stderr, "Invalid output format parameters.\n");
 exit(1);
 }
 */

 av_dump_format(oc, 0, baseFileName, 1);


 //open the video codec only if there is video data
 if (video_index != -1) {
 if (outputStreams & OUTPUT_STREAM_VIDEO)
 codec = avcodec_find_decoder(video_st->codec->codec_id);
 else
 codec = avcodec_find_decoder(ic->streams[video_index]->codec->codec_id);
 if (!codec) {
 fprintf(stderr, "Could not find video decoder, key frames will not be honored.\n");
 }

 if (outputStreams & OUTPUT_STREAM_VIDEO)
 ret = avcodec_open2(video_st->codec, codec, NULL);
 else
 avcodec_open2(ic->streams[video_index]->codec, codec, NULL);
 if (ret < 0) {
 fprintf(stderr, "Could not open video decoder, key frames will not be honored.\n");
 }
 }

 snprintf(currentOutputFileName, strlen(baseDirName) + strlen(baseFileName) + strlen(baseFileExtension) + 10, "%s%s-%u%s", baseDirName, baseFileName, output_index++, baseFileExtension);

 if (avio_open(&oc->pb, currentOutputFileName, URL_WRONLY) < 0) {
 fprintf(stderr, "Could not open '%s'.\n", currentOutputFileName);
 exit(1);
 }
 newFile = 1;

 int r = avformat_write_header(oc,NULL);
 if (r) {
 fprintf(stderr, "Could not write mpegts header to first output file.\n");
 debugReturnCode(r);
 exit(1);
 }

 //no segment info is written here. This just creates the shell of the playlist file
 write_index = !write_index_file(playlistFilename, tempPlaylistName, segmentLength, actual_segment_durations, baseDirName, baseFileName, baseFileExtension, first_segment, last_segment);

 do {
 AVPacket packet;

 decode_done = av_read_frame(ic, &packet);

 if (decode_done < 0) {
 break;
 }

 if (av_dup_packet(&packet) < 0) {
 fprintf(stderr, "Could not duplicate packet.");
 av_free_packet(&packet);
 break;
 }

 //this time is used to check for a break in the segments
 // if (packet.stream_index == video_index && (packet.flags & PKT_FLAG_KEY))
 // {
 // segment_time = (double)video_st->pts.val * video_st->time_base.num / video_st->time_base.den;
 // }
#if USE_OLD_FFMPEG
 if (packet.stream_index == video_index && (packet.flags & PKT_FLAG_KEY))
#else
 if (packet.stream_index == video_index && (packet.flags & AV_PKT_FLAG_KEY))
#endif
 {
 segment_time = (double) packet.pts * ic->streams[video_index]->time_base.num / ic->streams[video_index]->time_base.den;
 }
 // else if (video_index < 0)
 // {
 // segment_time = (double)audio_st->pts.val * audio_st->time_base.num / audio_st->time_base.den;
 // }

 //get the most recent packet time
 //this time is used when the time for the final segment is printed. It may not be on the edge of
 //of a keyframe!
 if (packet.stream_index == video_index)
 packet_time = (double) packet.pts * ic->streams[video_index]->time_base.num / ic->streams[video_index]->time_base.den; //(double)video_st->pts.val * video_st->time_base.num / video_st->time_base.den;
 else if (outputStreams & OUTPUT_STREAM_AUDIO)
 packet_time = (double) audio_st->pts.val * audio_st->time_base.num / audio_st->time_base.den;
 else
 continue;
 //start looking for segment splits for videos one half second before segment duration expires. This is because the
 //segments are split on key frames so we cannot expect all segments to be split exactly equally.
 if (segment_time - prev_segment_time >= segmentLength - 0.5) {
 fprintf(stderr, "looking to print index file at time %lf\n", segment_time);
 avio_flush(oc->pb);
 avio_close(oc->pb);

 if (write_index) {
 actual_segment_durations[++last_segment] = (unsigned int) rint(segment_time - prev_segment_time);
 write_index = !write_index_file(playlistFilename, tempPlaylistName, segmentLength, actual_segment_durations, baseDirName, baseFileName, baseFileExtension, first_segment, last_segment);
 fprintf(stderr, "Writing index file at time %lf\n", packet_time);
 }

 struct stat st;
 stat(currentOutputFileName, &st);
 output_bytes += st.st_size;

 snprintf(currentOutputFileName, strlen(baseDirName) + strlen(baseFileName) + strlen(baseFileExtension) + 10, "%s%s-%u%s", baseDirName, baseFileName, output_index++, baseFileExtension);
 if (avio_open(&oc->pb, currentOutputFileName, URL_WRONLY) < 0) {
 fprintf(stderr, "Could not open '%s'\n", currentOutputFileName);
 break;
 }

 newFile = 1;
 prev_segment_time = segment_time;
 }

 if (outputStreams == OUTPUT_STREAM_AUDIO && packet.stream_index == audio_index) {
 if (newFile && outputStreams == OUTPUT_STREAM_AUDIO) {
 //add id3 tag info
 //fprintf(stderr, "adding id3tag to file %s\n", currentOutputFileName);
 //printf("%lf %lld %lld %lld %lld %lld %lf\n", segment_time, audio_st->pts.val, audio_st->cur_dts, audio_st->cur_pkt.pts, packet.pts, packet.dts, packet.dts * av_q2d(ic->streams[audio_index]->time_base) );
 fill_id3_tag((char*) id3_tag, id3_tag_size, packet.dts);
 avio_write(oc->pb, id3_tag, id3_tag_size);
 avio_write(oc->pb, image_id3_tag, IMAGE_ID3_SIZE);
 avio_flush(oc->pb);
 newFile = 0;
 }

 packet.stream_index = 0; //only one stream in audio only segments
 ret = av_interleaved_write_frame(oc, &packet);
 } else if (outputStreams & OUTPUT_STREAM_VIDEO) {
 if (newFile) {
 //fprintf(stderr, "New File: %lld %lld %lld\n", packet.pts, video_st->pts.val, audio_st->pts.val);
 //printf("%lf %lld %lld %lld %lld %lld %lf\n", segment_time, audio_st->pts.val, audio_st->cur_dts, audio_st->cur_pkt.pts, packet.pts, packet.dts, packet.dts * av_q2d(ic->streams[audio_index]->time_base) );
 newFile = 0;
 }
 if (outputStreams == OUTPUT_STREAM_VIDEO)
 ret = av_write_frame(oc, &packet);
 else
 ret = av_interleaved_write_frame(oc, &packet);
 }

 if (ret < 0) {
 fprintf(stderr, "Warning: Could not write frame of stream.\n");
 } else if (ret > 0) {
 fprintf(stderr, "End of stream requested.\n");
 av_free_packet(&packet);
 break;
 }

 av_free_packet(&packet);
 } while (!decode_done);

 //make sure all packets are written and then close the last file.
 avio_flush(oc->pb);
 av_write_trailer(oc);

 if (video_st && video_st->codec)
 avcodec_close(video_st->codec);

 if (audio_st && audio_st->codec)
 avcodec_close(audio_st->codec);

 for (i = 0; i < oc->nb_streams; i++) {
 av_freep(&oc->streams[i]->codec);
 av_freep(&oc->streams[i]);
 }

 avio_close(oc->pb);
 av_free(oc);

 struct stat st;
 stat(currentOutputFileName, &st);
 output_bytes += st.st_size;


 if (write_index) {
 actual_segment_durations[++last_segment] = (unsigned int) rint(packet_time - prev_segment_time);

 //make sure that the last segment length is not zero
 if (actual_segment_durations[last_segment] == 0)
 actual_segment_durations[last_segment] = 1;

 write_index_file(playlistFilename, tempPlaylistName, segmentLength, actual_segment_durations, baseDirName, baseFileName, baseFileExtension, first_segment, last_segment);

 }

 write_stream_size_file(baseDirName, baseFileName, output_bytes * 8 / segment_time);

 return 0;
}
</outfile></infile>