| 1913 | } |
| 1914 | |
| 1915 | static int dash_parse_prft(DASHContext *c, AVPacket *pkt) |
| 1916 | { |
| 1917 | OutputStream *os = &c->streams[pkt->stream_index]; |
| 1918 | AVProducerReferenceTime *prft; |
| 1919 | size_t side_data_size; |
| 1920 | |
| 1921 | prft = (AVProducerReferenceTime *)av_packet_get_side_data(pkt, AV_PKT_DATA_PRFT, &side_data_size); |
| 1922 | if (!prft || side_data_size != sizeof(AVProducerReferenceTime) || (prft->flags && prft->flags != 24)) { |
| 1923 | // No encoder generated or user provided capture time AVProducerReferenceTime side data. Instead |
| 1924 | // of letting the mov muxer generate one, do it here so we can also use it for the manifest. |
| 1925 | prft = (AVProducerReferenceTime *)av_packet_new_side_data(pkt, AV_PKT_DATA_PRFT, |
| 1926 | sizeof(AVProducerReferenceTime)); |
| 1927 | if (!prft) |
| 1928 | return AVERROR(ENOMEM); |
| 1929 | prft->wallclock = av_gettime(); |
| 1930 | prft->flags = 24; |
| 1931 | } |
| 1932 | if (os->first_pts == AV_NOPTS_VALUE) { |
| 1933 | os->producer_reference_time = *prft; |
| 1934 | if (c->target_latency_refid < 0) |
| 1935 | c->target_latency_refid = pkt->stream_index; |
| 1936 | } |
| 1937 | |
| 1938 | return 0; |
| 1939 | } |
| 1940 | |
| 1941 | static int dash_write_packet(AVFormatContext *s, AVPacket *pkt) |
| 1942 | { |
no test coverage detected