}
if (data->IsEos()) {
+ TRACKRENDERER_DEBUG("submit EOS type:%d", type);
pipeline_->SignalEmitByName(element, "end-of-stream");
submitstate = SubmitStatus::kSuccess;
return true;
TRACKRENDERER_LEAVE;
}
+bool TrackRenderer::CreateDecoder_(const Track* track, const GstCaps* caps) {
+ TRACKRENDERER_ENTER;
+ if (!track || !caps) {
+ TRACKRENDERER_ERROR("Invalid input, track[%p] caps[%p]", track, caps);
+ return false;
+ }
+
+ GstElementFactoryListType factory_type = GST_ELEMENT_FACTORY_TYPE_DECODER;
+ if (!track->use_swdecoder)
+ factory_type |= GST_ELEMENT_FACTORY_TYPE_HARDWARE;
+
+ Elements element;
+ if (track->type == kTrackTypeVideo) {
+ element = Elements::kDecVideo;
+ if (internal::GetIniValue(properties_, "use_default_video_codec_sw"))
+ factory_type &= ~GST_ELEMENT_FACTORY_TYPE_HARDWARE;
+ } else if (track->type == kTrackTypeAudio) {
+ element = Elements::kDecAudio;
+ } else {
+ TRACKRENDERER_ERROR("Invalid track type %d", track->type);
+ return false;
+ }
+
+ if (!pipeline_->FactoryMake(element, caps, factory_type, NULL)) {
+ TRACKRENDERER_ERROR("Failed to make decoder");
+ return false;
+ }
+
+ TRACKRENDERER_LEAVE;
+ return true;
+}
+
void TrackRenderer::GstCapsNotifyCb_(GstPad* pad, GParamSpec* unused, gpointer userdata)
{
TRACKRENDERER_ENTER;
drm_property_, track->mimetype));
if (!pipeline_->FactoryMake(Elements::kParseVideo, (GstCaps*)caps_for_parser.GetCaps_(),
GST_ELEMENT_FACTORY_TYPE_PARSER, NULL))
- TRACKRENDERER_ERROR("fail to make parser");
+ TRACKRENDERER_ERROR("Failed to make parser");
} else {
if (!pipeline_->FactoryMake(Elements::kParseVideo, (GstCaps*)caps.GetCaps_(),
GST_ELEMENT_FACTORY_TYPE_PARSER, NULL))
- TRACKRENDERER_ERROR("fail to make parser");
+ TRACKRENDERER_ERROR("Failed to make parser");
}
auto parse_caps =
gstguard::make_guard(pipeline_->GetSrcPadCaps(Elements::kParseVideo));
- /* create video decoder */
- GstElementFactoryListType factory_type = GST_ELEMENT_FACTORY_TYPE_DECODER;
- if (!track->use_swdecoder &&
- !internal::GetIniValue(properties_, "use_default_video_codec_sw"))
- factory_type |= GST_ELEMENT_FACTORY_TYPE_HARDWARE;
-
- if (!pipeline_->FactoryMake(Elements::kDecVideo,
- static_cast<GstCaps*>(parse_caps ? parse_caps.get() : caps.GetCaps_()),
- factory_type, NULL)) {
+ if (!CreateDecoder_(track, parse_caps ? static_cast<GstCaps*>(parse_caps.get()) : caps.GetCaps_())) {
+ TRACKRENDERER_ERROR("Failed to make video decoder");
+ pipeline_->ElementRemove(Elements::kAppSrcVideo);
+ pipeline_->ElementRemove(Elements::kParseVideo);
const ErrorType err = ErrorType::kNotSupportedVideoCodec;
- TRACKRENDERER_ERROR("fail to make decoder");
eventlistener_->OnError(err);
return false;
}
if (internal::IsDisplayNeeded(display_type))
videosink_name = kVideoSinkName;
+ /* FIXME: created elements have to be released in case of error */
if (!pipeline_->FactoryMake(Elements::kSinkVideo, videosink_name, NULL)) {
- TRACKRENDERER_ERROR("fail to make video sink(%s)", videosink_name);
+ TRACKRENDERER_ERROR("Failed to make video sink(%s)", videosink_name);
return false;
}
auto parse_caps =
gstguard::make_guard(pipeline_->GetSrcPadCaps(Elements::kParseAudio));
- GstElementFactoryListType factory_type = GST_ELEMENT_FACTORY_TYPE_DECODER;
- if (!track->use_swdecoder)
- factory_type |= GST_ELEMENT_FACTORY_TYPE_HARDWARE;
-
- if (!pipeline_->FactoryMake(Elements::kDecAudio,
- static_cast<GstCaps*>(parse_caps ? parse_caps.get() : caps.GetCaps_()),
- factory_type, NULL)) {
+ if (!CreateDecoder_(track, parse_caps ? static_cast<GstCaps*>(parse_caps.get()) : caps.GetCaps_())) {
+ TRACKRENDERER_ERROR("Failed to make audio decoder");
+ pipeline_->ElementRemove(Elements::kAppSrcAudio);
+ pipeline_->ElementRemove(Elements::kParseAudio);
const ErrorType err = ErrorType::kNotSupportedAudioCodec;
- TRACKRENDERER_ERROR("fail to make decoder");
eventlistener_->OnError(err);
return false;
}
Track track;
if (!track_util::GetActiveTrack(trackinfo_, kTrackTypeAudio, &track)) {
+ pipeline_->ElementRemove(Elements::kParseAudio);
TRACKRENDERER_ERROR("Failed to find active audio track.");
return false;
}
- GstElementFactoryListType factory_type = GST_ELEMENT_FACTORY_TYPE_DECODER;
- if (!track.use_swdecoder)
- factory_type |= GST_ELEMENT_FACTORY_TYPE_HARDWARE;
auto parse_caps =
gstguard::make_guard(pipeline_->GetSrcPadCaps(Elements::kParseAudio));
auto parse_caps_str = gstguard::make_guard(gst_caps_to_string(parse_caps.get()));
TRACKRENDERER_INFO("parse caps %s", parse_caps_str.get());
- if (!pipeline_->FactoryMake(Elements::kDecAudio, (GstCaps*)parse_caps.get(),
- factory_type, NULL)) {
+ if (!CreateDecoder_(&track, static_cast<GstCaps*>(parse_caps.get()))) {
+ TRACKRENDERER_ERROR("Failed to make audio decoder");
+ pipeline_->ElementRemove(Elements::kParseAudio);
const ErrorType err = ErrorType::kNotSupportedAudioCodec;
eventlistener_->OnError(err);
return false;
}
+
pipeline_->FactoryMake(Elements::kAudioConvert, "audioconvert", nullptr);
pipeline_->FactoryMake(Elements::kAudioResample, "audioresample", nullptr);
pipeline_->FactoryMake(Elements::kSinkAudio, kAudioSinkName, nullptr);
auto parse_caps =
gstguard::make_guard(pipeline_->GetSrcPadCaps(Elements::kParseVideo));
- GstElementFactoryListType factory_type = GST_ELEMENT_FACTORY_TYPE_DECODER;
- if (!track.use_swdecoder &&
- !internal::GetIniValue(properties_, "use_default_video_codec_sw"))
- factory_type |= GST_ELEMENT_FACTORY_TYPE_HARDWARE;
-
- if (!pipeline_->FactoryMake(Elements::kDecVideo,
- (GstCaps*)parse_caps.get(), factory_type, NULL)) {
+ if (!CreateDecoder_(&track, static_cast<GstCaps*>(parse_caps.get()))) {
+ TRACKRENDERER_ERROR("Failed to make video decoder");
+ pipeline_->ElementRemove(Elements::kParseVideo);
const ErrorType err = ErrorType::kNotSupportedVideoCodec;
eventlistener_->OnError(err);
return false;
auto new_caps_str = gstguard::make_guard(gst_caps_to_string(new_caps.GetCaps_()));
TRACKRENDERER_INFO("new caps %s", new_caps_str.get());
- gboolean caps_changed = !gst_caps_is_equal (new_caps.GetCaps_(), current_caps.get());
- if (caps_changed) { // caps is different
+ gboolean caps_changed = !gst_caps_is_equal(new_caps.GetCaps_(), current_caps.get());
+ if (caps_changed) {
TRACKRENDERER_INFO("Caps is changed");
pipeline_->PadAddProbe(Elements::kAppSrcAudio, kPadProbeCapsEvent, "src",
(GstPadProbeType)(GST_PAD_PROBE_TYPE_BLOCK | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM),
auto caps = caps_builder_.Build(track, internal::IsDrmEmeElementNecessary(
drm_property_, track.mimetype));
- GstElementFactoryListType factory_type = GST_ELEMENT_FACTORY_TYPE_DECODER;
- if (!track.use_swdecoder)
- factory_type |= GST_ELEMENT_FACTORY_TYPE_HARDWARE;
+ if (!CreateDecoder_(&track, caps.GetCaps_())) {
+ TRACKRENDERER_ERROR("Failed to make audio decoder");
+ return false;
+ }
- pipeline_->FactoryMake(Elements::kDecAudio, (GstCaps*)caps.GetCaps_(),
- factory_type, NULL);
pipeline_->FactoryMake(Elements::kSinkAudio, kAudioSinkName, NULL);
if (volume_ != kVolumeNone) {
SetVolume_();