-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);
-
- LastSubtitleMap::iterator last = _last_subtitle_start.find (stream);
- if (last != _last_subtitle_start.end() && last->second) {
- /* We have seen the start of a subtitle but not yet the end. Whatever this is
- finishes the previous subtitle, so add it */
- if (last->second->image) {
- stream->add_image_subtitle (last->second->id, ContentTimePeriod (last->second->time, period.from));
- } else {
- stream->add_text_subtitle (last->second->id, ContentTimePeriod (last->second->time, period.from));
- }
- if (sub.num_rects == 0) {
- /* This is a `proper' end-of-subtitle */
- _last_subtitle_start[stream] = optional<SubtitleStart> ();
- } else {
- /* This is just another subtitle, so we start again */
- _last_subtitle_start[stream] = SubtitleStart (id, starts_image, period.from);
- }
- } else if (sub.num_rects == 1) {
- if (period.to) {
- if (starts_image) {
- stream->add_image_subtitle (id, ContentTimePeriod (period.from, period.to.get ()));
- } else {
- stream->add_text_subtitle (id, ContentTimePeriod (period.from, period.to.get ()));
- }
- } else {
- _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);
- }
-}
-