We are now using a pts based approach, libavutil/libavcodec should provide the
correct pts-es anyway. This also fixes an issue when seeking to a frame with a
pts set to zero.
Signed-off-by: Marton Balint <cus@passwd.hu>
We use a refresh loop which displays the frames and also does the polling for
pending events in a non-blocking way. If we know the required delay until the
next frame, then exactly that amount of sleeping will be done. After each
handled event we check if we have to display a frame which kind of makes
displaying the frame a high priority event.
This improves greatly the smoothness of the video output especially with 50fps
content.
Signed-off-by: Marton Balint <cus@passwd.hu>
After this change the dimensions of single image videos will be remembered when
coming back from full screen. The issue was mentioned in ticket #2174.
Signed-off-by: Marton Balint <cus@passwd.hu>
We simply remove the fixed length VideoState->audio_buf2 and use
the previously unused VideoState->audio_buf1.
Fixes ticket #2191.
Signed-off-by: Marton Balint <cus@passwd.hu>
Actually we just re-create the filters, since there is no way to flush them.
Fixes hangup with yadif filter on seeking forward caused by a filtered frame
with a pts before the seek.
Signed-off-by: Marton Balint <cus@passwd.hu>
Previously VideoPicture->skip was used for that, using videoq.serial enables us
to detect obsolete frames right after pushing flush_pkt to the packet queue, so
we don't have to wait for the decoder thread to pop the flush packet anymore.
This is good because until now a full video picture queue may have blocked the
decoder thread.
Signed-off-by: Marton Balint <cus@passwd.hu>
If the XV image linesize was different from the width, SDL would create an
overlay wider than the actually requested one. This causes a greenish line on
the right, because the rightmost texel is blended with unset data. This patch
introduces a function which duplicates the rightmost texel to the unset space,
that way the blending will be done with duplicated border texels.
Signed-off-by: Marton Balint <cus@passwd.hu>
Now it should work for the timestamp based and the byte based case as well.
Also only update the external clock if the seeking was successful.
Signed-off-by: Marton Balint <cus@passwd.hu>
In timestamp based seeking we update the external clock to the seek target,
therefore we should use sane timestamps even if libavformat could handle
seeking before the start of the file.
Signed-off-by: Marton Balint <cus@passwd.hu>
I guess the user expects to see the stream with the highest bitrate, not with
the most frames, this is especially useful for multi bitrate streams.
This patch changes av_find_best_stream to select the stream based on a number
of conditions, the first condition has the highest priority, the last condition
has the lowest:
1) Select the stream with the highest FFMIN(5, codec_info_nb_frames) value
2) Select the stream with the highest bitrate
3) Select the stream with the highest codec_info_nb_frames
4) Select the first stream
Signed-off-by: Marton Balint <cus@passwd.hu>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Otherwise playing the video could be much slower than realtime if the system
can't decode or display the frames fast enough.
Signed-off-by: Marton Balint <cus@passwd.hu>
The real av_sync_type may be different to VideoState->av_sync_type, because the
required audio or video stream for audio or video clock may not be available.
We will use a function to query the real av_sync_type which is used for
determining the master clock.
Signed-off-by: Marton Balint <cus@passwd.hu>
The purpose of the serial field is to accompany the decoded data during the
decoding process to know if the decoded data belongs to the data stream after
the latest packet queue flush.
Signed-off-by: Marton Balint <cus@passwd.hu>
We now initalize the external clock to 0 and, we use the system clock to
regulate the timings of audio and video in external clock sync mode. We
recover from external clock sync loss, when the delay to external clock is
bigger than AV_NOSYNC_THRESHOLD.
Signed-off-by: Marton Balint <cus@passwd.hu>
Fixes some DNXHD files generated by AVID TM, where codec UL was set to A-law
meanwhile the real audio codec was PCM S16. According to SMPTE RP 224, A-law is
the default value for sound essence parameters therefore we should handle it
specially.
Signed-off-by: Marton Balint <cus@passwd.hu>
Reviewed-by: Tomas Härdin <tomas.hardin@codemill.se>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
A decoded and resampled audio frame may not fit in the current size which is
not handled by the current code causing out of order waveform displays or even
channel mixups. A todo is added because this part can certainly be improved to
consume less memory but work reliably for any frame size.
Signed-off-by: Marton Balint <cus@passwd.hu>
It was theoretically possible for pictq_prev_picture to fill the picture queue
which may have caused problems when a write to the queue was still in progress.
Signed-off-by: Marton Balint <cus@passwd.hu>
This also makes sure the aspect ratio of the picture is set before allocating
the picture, this way video_open can calculate with the correct aspect ratio
even for the first frame.
Signed-off-by: Marton Balint <cus@passwd.hu>
Freeing it in the end of the video thread is not a good idea, because we still
may need the filter names for the next video thread, in order to apply the
filters after chaning the video stream.
Signed-off-by: Marton Balint <cus@passwd.hu>
When the audio queue was empty, it was not filled until the 10ms delay expired
in the read thread. This patch changes the delay method with a condition wait,
which reacts to an empty queue a lot faster, therefore the audio buffer
underruns become less common especially after seeking.
Signed-off-by: Marton Balint <cus@passwd.hu>
Without this fix the last sample was missing from the packet.
Signed-off-by: Marton Balint <cus@passwd.hu>
Reviewed-by: Matthieu Bouron <matthieu.bouron@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
VideoPicture pixel format is set at allocation time, therefore it is not
reflecting the proper value.
Fixes files with changing pixel format in the avfilter disabled case.
Signed-off-by: Marton Balint <cus@passwd.hu>
Switching to visualization instead of exiting ffplay is a bit more tricky, so
just exit for now.
Fixes ticket 38.
Signed-off-by: Marton Balint <cus@passwd.hu>
We do this to ensure that input_get_buffer is not called from a
frame_worker_thread of a multithreaded decoder when we already freed the
filters.
Fixes occasional segfaults on video stream change.
Signed-off-by: Marton Balint <cus@passwd.hu>
This fixes occasional segfaults caused by lock request of the packet queue from
the reader thread.
Also don't allow to put frames into the queue when it's aborted, and don't try
to fill the queue with frames when it is aborted.
Signed-off-by: Marton Balint <cus@passwd.hu>
Use codec aspect ratio for frame aspect ratio if AVFrame is NULL.
Signed-off-by: Marton Balint <cus@passwd.hu>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Also use av_guess_sample_aspect_ratio for determining aspect ratio of the video
frame if not using avfilter.
Signed-off-by: Marton Balint <cus@passwd.hu>
Codec values may not reflect the actual frame size, and it also enables us to
simplify code in the avfilter enabled and the avfilter disabled case.
Signed-off-by: Marton Balint <cus@passwd.hu>
When we are using filter chains we have to set the aspect ratio of the source
to the best known value, we use the av_guess_sample_aspect_ratio function to
determine that.
Fixes ticket 1228.
Signed-off-by: Marton Balint <cus@passwd.hu>
Guesses the sample aspect ratio of a frame, based on both the stream and the
frame aspect ratio.
Since the frame aspect ratio is set by the codec but the stream aspect ratio
is set by the demuxer, these two may not be equal. This function tries to
return the value that you should use if you would like to display the frame.
Basic logic is to use the stream aspect ratio if it is set to something sane
otherwise use the frame aspect ratio. This way a container setting, which is
usually easy to modify can override the coded value in the frames.
Signed-off-by: Marton Balint <cus@passwd.hu>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This reduces the number of queued frames for audio data but also reduces the
amount of A-V difference after changing the audio stream (because less frames
are queued). Fixes bug #1035.
Signed-off-by: Marton Balint <cus@passwd.hu>
Otherwise we may use the remaining data of the last packet from the previous
audio stream. Fixes bug #951.
Signed-off-by: Marton Balint <cus@passwd.hu>
Also change synchronize_audio to only calculate the wanted number of samples
instead of doing the actual synchronization, and make swr_convert handle the
sample addition or deletion.
This new method replaces the old buggy way which simply deleted or
multiplied samples.
Signed-off-by: Marton Balint <cus@passwd.hu>
The new version returns AVERROR(EINVAL) is the specified paramters are invalid,
and also creates the resampler if none was used so far.
Signed-off-by: Marton Balint <cus@passwd.hu>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>