+ } else {
+ if (!pos) {
+ if (av_new_packet(pkt, pd->fragment_size) < 0) {
+ ret = AVERROR(ENOMEM);
+ goto unlock_and_fail;
+ }
+
+ dts = av_gettime();
+ pa_operation_unref(pa_stream_update_timing_info(pd->stream, NULL, NULL));
+
+ if (pa_stream_get_latency(pd->stream, &latency, &negative) >= 0) {
+ if (negative) {
+ dts += latency;
+ } else
+ dts -= latency;
+ } else {
+ av_log(s, AV_LOG_WARNING, "pa_stream_get_latency() failed\n");
+ }
+ }
+ if (pkt->size - pos < read_length) {
+ if (pos)
+ break;
+ pa_stream_drop(pd->stream);
+ /* Oversized fragment??? */
+ ret = AVERROR_EXTERNAL;
+ goto unlock_and_fail;
+ }
+ memcpy(pkt->data + pos, read_data, read_length);
+ pos += read_length;
+ pa_stream_drop(pd->stream);