- int const hlim = min (rect->y + rect->h, image->size().height) - rect->y;
-
- /* Start of the first line in the subtitle */
- uint8_t* sub_p = rect->pict.data[0];
- /* sub_p looks up into a RGB palette which is here */
- uint32_t const * palette = (uint32_t *) rect->pict.data[1];
-
- for (int sub_y = 0; sub_y < hlim; ++sub_y) {
- /* Pointers to the start of this line */
- uint8_t* sub_line_p = sub_p;
- uint8_t* frame_line_y_p = frame_y_p + rect->x;
- uint8_t* frame_line_u_p = frame_u_p + (rect->x / 2);
- uint8_t* frame_line_v_p = frame_v_p + (rect->x / 2);
-
- /* U and V are subsampled */
- uint8_t next_u = 0;
- uint8_t next_v = 0;
- int subsample_step = 0;
-
- for (int sub_x = 0; sub_x < rect->w; ++sub_x) {
-
- /* RGB value for this subtitle pixel */
- uint32_t const val = palette[*sub_line_p++];
-
- int const red = (val & 0xff);
- int const green = (val & 0xff00) >> 8;
- int const blue = (val & 0xff0000) >> 16;
- float const alpha = ((val & 0xff000000) >> 24) / 255.0;
-
- /* Alpha-blend Y */
- int const cy = *frame_line_y_p;
- *frame_line_y_p++ = int (cy * (1 - alpha)) + int (RGB_TO_Y_CCIR (red, green, blue) * alpha);
-
- /* Store up U and V */
- next_u |= ((RGB_TO_U_CCIR (red, green, blue, 0) & 0xf0) >> 4) << (4 * subsample_step);
- next_v |= ((RGB_TO_V_CCIR (red, green, blue, 0) & 0xf0) >> 4) << (4 * subsample_step);
-
- if (subsample_step == 1 && (sub_y % 2) == 0) {
- int const cu = *frame_line_u_p;
- int const cv = *frame_line_v_p;
-
- *frame_line_u_p++ =
- int (((cu & 0x0f) * (1 - alpha) + (next_u & 0x0f) * alpha)) |
- int (((cu & 0xf0) * (1 - alpha) + (next_u & 0xf0) * alpha));
-
- *frame_line_v_p++ =
- int (((cv & 0x0f) * (1 - alpha) + (next_v & 0x0f) * alpha)) |
- int (((cv & 0xf0) * (1 - alpha) + (next_v & 0xf0) * alpha));
-
- next_u = next_v = 0;
- }
-
- subsample_step = (subsample_step + 1) % 2;
- }
-
- sub_p += rect->pict.linesize[0];
- frame_y_p += image->line_size()[0];
- if ((sub_y % 2) == 0) {
- frame_u_p += image->line_size()[1];
- frame_v_p += image->line_size()[2];
- }
+string
+FFmpegDecoder::stream_name (AVStream* s) const
+{
+ stringstream n;
+
+ AVDictionaryEntry const * lang = av_dict_get (s->metadata, "language", 0, 0);
+ if (lang) {
+ n << lang->value;
+ }
+
+ AVDictionaryEntry const * title = av_dict_get (s->metadata, "title", 0, 0);
+ if (title) {
+ if (!n.str().empty()) {
+ n << " ";