#include "i18n.h"
-#define LOG_GENERAL(...) _log->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL);
-#define LOG_ERROR(...) _log->log (String::compose (__VA_ARGS__), Log::TYPE_ERROR);
-#define LOG_WARNING_NC(...) _log->log (__VA_ARGS__, Log::TYPE_WARNING);
-#define LOG_WARNING(...) _log->log (String::compose (__VA_ARGS__), Log::TYPE_WARNING);
+#define LOG_GENERAL(...) _log->log (String::compose (__VA_ARGS__), LogEntry::TYPE_GENERAL);
+#define LOG_ERROR(...) _log->log (String::compose (__VA_ARGS__), LogEntry::TYPE_ERROR);
+#define LOG_WARNING_NC(...) _log->log (__VA_ARGS__, LogEntry::TYPE_WARNING);
+#define LOG_WARNING(...) _log->log (String::compose (__VA_ARGS__), LogEntry::TYPE_WARNING);
using std::cout;
using std::vector;
}
if (frame_finished) {
- ContentTime const ct = ContentTime::from_seconds (
+ ContentTime ct = ContentTime::from_seconds (
av_frame_get_best_effort_timestamp (_frame) *
av_q2d ((*stream)->stream (_format_context)->time_base))
+ _pts_offset;
0, (*stream)->stream(_format_context)->codec->channels, _frame->nb_samples, audio_sample_format (*stream), 1
);
- audio (*stream, deinterleave_audio (*stream, _frame->data, data_size), ct);
+ shared_ptr<AudioBuffers> data = deinterleave_audio (*stream, _frame->data, data_size);
+
+ if (ct < ContentTime ()) {
+ /* Discard audio data that comes before time 0 */
+ Frame const remove = min (int64_t (data->frames()), (-ct).frames_ceil(double((*stream)->frame_rate ())));
+ data->move (remove, 0, data->frames() - remove);
+ data->set_frames (data->frames() - remove);
+ ct += ContentTime::from_frames (remove, (*stream)->frame_rate ());
+ }
+
+ if (data->frames() > 0) {
+ audio (*stream, data, ct);
+ }
}
copy_packet.data += decode_result;
indicate that the previous subtitle should stop. We can ignore it here.
*/
return;
- } else if (sub.num_rects > 1) {
- throw DecodeError (_("multi-part subtitles not yet supported"));
}
/* Subtitle PTS (within the source, not taking into account any of the
period.to = ffmpeg_content()->subtitle_stream()->find_subtitle_to (period.from);
}
- AVSubtitleRect const * rect = sub.rects[0];
-
- switch (rect->type) {
- case SUBTITLE_NONE:
- break;
- case SUBTITLE_BITMAP:
- decode_bitmap_subtitle (rect, period);
- break;
- case SUBTITLE_TEXT:
- cout << "XXX: SUBTITLE_TEXT " << rect->text << "\n";
- break;
- case SUBTITLE_ASS:
- cout << "XXX: SUBTITLE_ASS " << rect->ass << "\n";
- break;
+ for (unsigned int i = 0; i < sub.num_rects; ++i) {
+ AVSubtitleRect const * rect = sub.rects[i];
+
+ switch (rect->type) {
+ case SUBTITLE_NONE:
+ break;
+ case SUBTITLE_BITMAP:
+ decode_bitmap_subtitle (rect, period);
+ break;
+ case SUBTITLE_TEXT:
+ cout << "XXX: SUBTITLE_TEXT " << rect->text << "\n";
+ break;
+ case SUBTITLE_ASS:
+ cout << "XXX: SUBTITLE_ASS " << rect->ass << "\n";
+ break;
+ }
}
avsubtitle_free (&sub);