-void
-FFmpegExaminer::subtitle_packet (AVCodecContext* context, shared_ptr<FFmpegSubtitleStream> stream)
-{
- 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);
- }
-
- for (unsigned int i = 0; i < sub.num_rects; ++i) {
- if (sub.rects[i]->type == SUBTITLE_BITMAP) {
-#ifdef DCPOMATIC_HAVE_AVSUBTITLERECT_PICT
- uint32_t* palette = (uint32_t *) sub.rects[i]->pict.data[1];
- for (int j = 0; j < sub.rects[i]->nb_colors; ++j) {
- RGBA rgba (
- (palette[j] & 0x00ff0000) >> 16,
- (palette[j] & 0x0000ff00) >> 8,
- (palette[j] & 0x000000ff) >> 0,
- (palette[j] & 0xff000000) >> 24
- );
-
- stream->set_colour (rgba, rgba);
- }
-#else
- uint32_t* palette = (uint32_t *) sub.rects[i]->data[1];
- for (int j = 0; j < sub.rects[i]->nb_colors; ++j) {
- RGBA rgba (
- (palette[j] & 0x00ff0000) >> 16,
- (palette[j] & 0x0000ff00) >> 8,
- (palette[j] & 0x000000ff) >> 0,
- (palette[j] & 0xff000000) >> 24
- );
-
- stream->set_colour (rgba, rgba);
- }
-#endif
- }
- }
-
- avsubtitle_free (&sub);
- }
-}
-