- int frame_finished;
- AVSubtitle sub;
- if (avcodec_decode_subtitle2 (context, &sub, &frame_finished, &_packet) >= 0 && frame_finished) {
- string id = subtitle_id (sub);
- FFmpegSubtitlePeriod const period = subtitle_period (sub);
- bool const starts_image = subtitle_starts_image (sub);
-
- /* Some streams (notably DVB streams) have subtitles which have a specified end time
- but which are then stopped earlier than this by a zero-num_rect subtitle.
- */
-
- LastSubtitleMap::iterator last = _last_subtitle_start.find (stream);
- if (sub.num_rects == 0 && last != _last_subtitle_start.end() && last->second) {
- /* Set (or fix) the `to' time for the last subtitle */
- stream->set_subtitle_to (last->second->id, period.from);
- _last_subtitle_start[stream] = optional<SubtitleStart> ();
- } else if (sub.num_rects > 0) {
- /* Add a subtitle; if we don't know the `to' time we set it to the from time and fix it later */
- if (starts_image) {
- stream->add_image_subtitle (id, ContentTimePeriod (period.from, period.to.get_value_or (period.from)));
- } else {
- stream->add_text_subtitle (id, ContentTimePeriod (period.from, period.to.get_value_or (period.from)));
- }
-
- _last_subtitle_start[stream] = SubtitleStart (id, starts_image, period.from);
- }