| 152 | } |
| 153 | |
| 154 | bool HTTPWriter::writeMedia(MediaType type,UInt32 time,PacketReader& packet,const Parameters& properties) { |
| 155 | if(state()==CLOSED) |
| 156 | return true; |
| 157 | switch(type) { |
| 158 | case START: |
| 159 | case STOP: |
| 160 | break; |
| 161 | case INIT: { |
| 162 | if (time!=DATA) // one init by mediatype, we want here just init one time! |
| 163 | break; |
| 164 | Exception ex; |
| 165 | if (!_pRequest) |
| 166 | ex.set(Exception::APPLICATION, "HTTP streaming without request related"); |
| 167 | else if (_pRequest->contentSubType.compare(0, 5, "x-flv")==0) |
| 168 | _pMedia.reset(new FLV(properties,_session.invoker.poolBuffers)); |
| 169 | else if(_pRequest->contentSubType.compare(0,4,"mp2t")==0) |
| 170 | _pMedia.reset(new MPEGTS(_session.invoker.poolBuffers)); |
| 171 | else |
| 172 | ex.set(Exception::APPLICATION, "HTTP streaming for a ",_pRequest->contentSubType," unsupported"); |
| 173 | |
| 174 | if (ex) { |
| 175 | close(ex); |
| 176 | return false; |
| 177 | } |
| 178 | // write a HTTP header without content-length (data==NULL and size==1) |
| 179 | _pMedia->write(createSender(true)->writeResponse("200 OK",true).packet); |
| 180 | break; |
| 181 | } |
| 182 | case AUDIO: |
| 183 | case VIDEO: { |
| 184 | if (!_pMedia) |
| 185 | return false; |
| 186 | HTTPSender* pSender(createSender(false)); |
| 187 | if (!pSender) |
| 188 | return false; |
| 189 | _pMedia->write(pSender->writeRaw(),type,time,packet.current(), packet.available()); |
| 190 | break; |
| 191 | } |
| 192 | case DATA: { |
| 193 | if (!_pMedia) |
| 194 | return false; |
| 195 | HTTPSender* pSender(createSender(false)); |
| 196 | if (!pSender) |
| 197 | return false; |
| 198 | _pMedia->write(pSender->writeRaw(),(Writer::DataType)(time & 0xFF),(MIME::Type)(time >> 8),packet); |
| 199 | break; |
| 200 | } |
| 201 | default: |
| 202 | return Writer::writeMedia(type,time,packet,properties); |
| 203 | } |
| 204 | return true; |
| 205 | } |
| 206 | |
| 207 | |
| 208 | } // namespace Mona |