pitivi / gst-editing-services

MIRROR of the GStreamer Editing Services repository for pull requests. The official git repository is at http://cgit.freedesktop.org/gstreamer/gst-editing-services/
Other
1 stars 1 forks source link

Timeline does not start when trying to encode with a video/quicktime container #39

Closed lubosz closed 11 years ago

lubosz commented 11 years ago

This script shows that the timeline does not start for quicktime, but for matroska. Same codecs.

#!/usr/bin/python
from gi.repository import GES, Gst, Gtk, GstPbutils, GObject

import signal

outputFile = 'file:///home/bmonkey/workspace/ges/export/quickTimeTest'

def handle_sigint(sig, frame):
    Gtk.main_quit()

def busMessageCb(bus, message):
    if message.type == Gst.MessageType.EOS:
        print("eos")
        Gtk.main_quit()
    elif message.type == Gst.MessageType.ERROR:
        print (message.parse_error())

def duration_querier(pipeline):
    print(pipeline.query_position(Gst.Format.TIME)[1] / Gst.SECOND)
    return True

def encoderProfile(container, video, audio):
  container_profile = GstPbutils.EncodingContainerProfile.new(
    "quicktime",
    "QuickTime Encoding Profile",
    Gst.Caps.new_empty_simple(container),
    None)

  video_profile = GstPbutils.EncodingVideoProfile.new(
    Gst.Caps.new_empty_simple(video),
    None,
    Gst.Caps.new_empty_simple("video/x-raw"),
    0)
  container_profile.add_profile(video_profile)

  audio_profile = GstPbutils.EncodingAudioProfile.new(
    Gst.Caps.new_empty_simple(audio),
    None,
    Gst.Caps.new_empty_simple("audio/x-raw"),
    0)
  container_profile.add_profile(audio_profile)

  return container_profile

if __name__ =="__main__":
  Gst.init(None)
  GES.init()

  timeline = GES.Timeline.new_audio_video()
  layer = GES.Layer()
  timeline.add_layer(layer)
  asset = GES.Asset.request(GES.TestClip, None)

  layer.add_asset(asset, 0 * Gst.SECOND, 0, 10 * Gst.SECOND, GES.TrackType.UNKNOWN)

  timeline.commit()

  pipeline = GES.TimelinePipeline()
  pipeline.add_timeline(timeline)

  # does not start, no error
  format = ["video/quicktime", "video/x-h264", "audio/x-vorbis", "mp4"]

  # Works
  #format = ["video/x-matroska", "video/x-h264", "audio/x-vorbis", "mkv"]

  container_profile = encoderProfile(format[0], format[1], format[2])

  pipeline.set_render_settings(outputFile + "." + format[3], container_profile)
  pipeline.set_mode(GES.PipelineFlags.RENDER)
  pipeline.set_state(Gst.State.PLAYING)

  bus = pipeline.get_bus()
  bus.add_signal_watch()
  bus.connect("message", busMessageCb)
  GObject.timeout_add(300, duration_querier, pipeline)

  signal.signal(signal.SIGINT, handle_sigint)
  Gtk.main()
MathieuDuponchelle commented 11 years ago

Yes, that's something to add to integration tests, fairly simple, for now we only test encoding with an ogg profile.

MathieuDuponchelle commented 11 years ago

https://github.com/pitivi/gst-editing-services/issues/41

lubosz commented 11 years ago

These is a excerpt of the log (i deleted duplicate errors) from the integration test suite

Lines like these confirm this bug: ges/integration.c:432:E:render:test_effect_render_to_aac_h264_quicktime_mp3_h264_mov:0: (after this point) Test timeout expired

Do you also encounter them?

bmonkey@bbook:~/workspace/ges/gst-editing-services (integration)$ make check-integration 
cd tests/check && make check-integration
make[1]: Entering directory `/home/bmonkey/workspace/ges/gst-editing-services/tests/check'
./integration
Running suite(s): ges-render
0:00:25.029348973 25325 0x7f4618029730 ERROR                  check ges/integration.c:184:my_bus_callback: Error: No valid frames found before end of stream

0:00:29.618217891 25401 0x7f4604155390 ERROR                  libav :0:: get_buffer() failed (stride changed)
0:00:29.618319929 25401 0x7f4604155390 ERROR                  libav :0:: decode_slice_header error
0:00:29.618337110 25401 0x7f4604155390 ERROR                  libav :0:: no frame!

Unexpected critical/warning: No headers or buffers on pad muxer:video_763748129

x264 [error]: high10 profile doesn't support 4:4:4

0:02:05.485445372 26450 0x7f4620054330 ERROR                  check ges/integration.c:374:run_simple_seeks_test: Seeking at 0:00:01.500000000 to 0:00:01.800000000 did not happen

76%: Checks: 76, Failures: 7, Errors: 11
ges/integration.c:517:E:render:test_basic_render_to_aac_h264_quicktime_vorbis_vp8_webm:0: (after this point) Test timeout expired
ges/integration.c:517:E:render:test_basic_render_to_aac_h264_quicktime_mp3_h264_mov:0: (after this point) Test timeout expired
ges/integration.c:517:E:render:test_basic_render_to_vorbis_h264_matroska_vorbis_vp8_webm:0: (after this point) Received signal 11 (Segmentation fault)
ges/integration.c:517:E:render:test_basic_render_to_vorbis_h264_matroska_mp3_h264_mov:0: (after this point) Received signal 11 (Segmentation fault)
gstcheck.c:75:F:render:test_effect_render_to_vorbis_theora_ogg_mp3_h264_mov:0: Unexpected critical/warning: No headers or buffers on pad muxer:video_763748129
ges/integration.c:432:E:render:test_effect_render_to_aac_h264_quicktime_vorbis_vp8_webm:0: (after this point) Test timeout expired
ges/integration.c:432:E:render:test_effect_render_to_aac_h264_quicktime_mp3_h264_mov:0: (after this point) Test timeout expired
ges/integration.c:432:E:render:test_effect_render_to_vorbis_h264_matroska_vorbis_vp8_webm:0: (after this point) Received signal 11 (Segmentation fault)
ges/integration.c:432:E:render:test_effect_render_to_vorbis_h264_matroska_mp3_h264_mov:0: (after this point) Received signal 11 (Segmentation fault)
ges/integration.c:476:E:render:test_transition_render_to_aac_h264_quicktime_vorbis_vp8_webm:0: (after this point) Test timeout expired
ges/integration.c:476:E:render:test_transition_render_to_aac_h264_quicktime_mp3_h264_mov:0: (after this point) Test timeout expired
ges/integration.c:270:F:render:test_transition_render_to_vorbis_h264_matroska_mp3_h264_mov:0: Duration 0:00:02.776689340 not in range [0:00:02.900000000 -- 0:00:03.100000000]
ges/integration.c:551:F:render:test_image_playback_vorbis_vp8_webm:0: Assertion 'asset1 != NULL' failed
ges/integration.c:551:F:render:test_image_playback_vorbis_theora_ogv:0: Assertion 'asset1 != NULL' failed
ges/integration.c:551:F:render:test_image_playback_raw_h264_mov:0: Assertion 'asset1 != NULL' failed
ges/integration.c:551:F:render:test_image_playback_mp3_h264_mov:0: Assertion 'asset1 != NULL' failed
ges/integration.c:231:E:render:test_seeking_playback_raw_h264_mov:0: (after this point) Test timeout expired
ges/integration.c:379:F:render:test_seeking_audio_playback_raw_h264_mov:0: Got EOS before being able to execute all seeks
make[1]: *** [check-integration] Error 18
make[1]: Leaving directory `/home/bmonkey/workspace/ges/gst-editing-services/tests/check'
make: *** [check-integration] Error 2
MathieuDuponchelle commented 11 years ago

Yes we do, working on fixing these one error at a time :)

lubosz commented 11 years ago

This can be closed, I was using a wrong caps constructor (or it was fixed somewhere else in gst)

This works now:

#!/usr/bin/python
from gi.repository import GES, Gst, Gtk, GstPbutils, GObject

import signal

outputFile = 'file:///home/bmonkey/workspace/ges/export/quickTimeTest'

def handle_sigint(sig, frame):
    Gtk.main_quit()

def busMessageCb(bus, message):
    if message.type == Gst.MessageType.EOS:
        print("eos")
        Gtk.main_quit()
    elif message.type == Gst.MessageType.ERROR:
        print (message.parse_error())

def duration_querier(pipeline):
    print(pipeline.query_position(Gst.Format.TIME)[1] / Gst.SECOND)
    return True

def encoderProfile(container, video, audio):

  cont_caps = Gst.Caps.from_string(container)

  container_profile = GstPbutils.EncodingContainerProfile.new(
    "quicktime",
    "QuickTime Encoding Profile",
    cont_caps,
    None)

  video_profile = GstPbutils.EncodingVideoProfile.new(
    Gst.Caps.from_string(video),
    None,
    Gst.Caps.from_string("video/x-raw"),
    0)
  container_profile.add_profile(video_profile)

  audio_profile = GstPbutils.EncodingAudioProfile.new(
    Gst.Caps.from_string(audio),
    None,
    Gst.Caps.from_string("audio/x-raw"),
    0)
  container_profile.add_profile(audio_profile)

  return container_profile

if __name__ =="__main__":
  Gst.init(None)
  GES.init()

  timeline = GES.Timeline.new_audio_video()
  layer = GES.Layer()
  timeline.add_layer(layer)
  asset = GES.Asset.request(GES.TestClip, None)

  layer.add_asset(asset, 0 * Gst.SECOND, 0, 10 * Gst.SECOND, GES.TrackType.UNKNOWN)

  timeline.commit()

  pipeline = GES.Pipeline()
  pipeline.add_timeline(timeline)

  format = ["video/quicktime,variant=iso", "video/x-h264", "audio/mpeg,mpegversion=1,layer=3", "mov"]

  container_profile = encoderProfile(format[0], format[1], format[2])

  pipeline.set_render_settings(outputFile + "." + format[3], container_profile)
  pipeline.set_mode(GES.PipelineFlags.RENDER)
  pipeline.set_state(Gst.State.PLAYING)

  bus = pipeline.get_bus()
  bus.add_signal_watch()
  bus.connect("message", busMessageCb)
  GObject.timeout_add(300, duration_querier, pipeline)

  signal.signal(signal.SIGINT, handle_sigint)
  Gtk.main()