My requirement is to stream mp4 video [audio is optional] via RTSP. I have used a code shared in the forum to check the rtsp video streaming.

reference:
http://gstreamer-devel.966125.n4.nabble.com/Continuously-streaming-a-video-file-code-review-td4671364.html

1. The pipeline seems to be proper and the bus callback and need data function is invoked.
2. The caps string is retrieved from the video file using the "gst-discoverer-1.0  xx.mp4 -v" command 
    [Is this the proper way to fetch the caps ? ]
3.  Using this command [client]
gst-launch-1.0 playbin uri="rtsp://19x.16x.12x.xx:554/test" tried to play the video stream.
4. The command line shows the server is active and the video is streaming. But no video output is displayed in the console. need_data and bus_callback functions are called when needed and I could see the buffer is pushed to appsrc.
5. The .mp4 file has both audio and video. But the pipeline constructed has only video src. I was able to use the same pipeline and stream the video without appsrc. 

I am sure that the issue may be in caps filters, but not sure how t build the cap filters manually.The problem occurs only when trying to use appsrc to stream the video. Can you please suggest the issue in the below code ? I tried to search in forum but with no help on this particular issue.

I am using appsrc to continuously stream the video by adding a bus watch for the EOS. Also tried using VLC to stream the video, no video is displayed but I could see the seekbar is moving with time lapsed [which means the video is streamed but not displayed due to wrong caps ?? ]

Thank you in advance for your help. 

[I tried to attach the source file but the "upload file"  menu is not showing up]

#include "stdafx.h"
#include <gst/gst.h>
#include <gst/app/gstappsink.h>
#include <gst/app/gstappsrc.h>
#include <gst/rtsp-server/rtsp-server.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DEFAULT_RTSP_PORT "554"
static char *port = (char *)DEFAULT_RTSP_PORT;
static char *server_addr = "19x.16x.12x.xx";

typedef struct _App App;
struct _App
{
        GstElement *videosink;
};
App s_app;

typedef struct {
        App *glblapp;
        GstClockTime timestamp;
} Context;



const gchar *pipe_line_string = "appsrc name=mysrc is-live=true max-bytes=0 do-timestamp=true min-latency=0 ! queue ! h264parse name=parse ! queue ! rtph264pay name=pay0 pt=96 timestamp-offset=0";

const gchar *videocaps =  "video/x-h264, stream-format=(string)avc, alignment=(string)au, level=(string)2.1, profile=(string)high, codec_data=(buffer)01640015ffe1001967640015acd941e08fea1000000300100000030320f162d96001000668ebe3cb22c0, width=(int)480, height=(int)270, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, chroma-format=(string)4:2:0, bit-depth-luma=(uint)8, bit-depth-chroma=(uint)8, parsed=(boolean)true";

// RTSP server signal and event handler
static void need_data(GstElement *appsrc, guint unused, Context *ctx)
{
        GstFlowReturn ret;
        GstSample *sample = gst_app_sink_pull_sample(GST_APP_SINK(ctx->glblapp->videosink));
        if (sample != NULL) {
                GstBuffer *buffer = gst_sample_get_buffer(sample);
                gst_sample_unref(sample);
                GST_BUFFER_PTS(buffer) = ctx->timestamp;
                GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 25);  
                ctx->timestamp += GST_BUFFER_DURATION(buffer);
                g_signal_emit_by_name(appsrc, "push-buffer", buffer, &ret);               
        }
}

static void media_configure(GstRTSPMediaFactory *factory, GstRTSPMedia *media, App *app)
{
        Context *ctx;
        GstElement *pipeline;
        GstElement *appsrc;
        pipeline = gst_rtsp_media_get_element(media);
        appsrc = gst_bin_get_by_name_recurse_up(GST_BIN(pipeline), "mysrc");
        gst_rtsp_media_set_reusable(media, TRUE);
        gst_util_set_object_arg(G_OBJECT(appsrc), "format", "time");

        g_object_set(G_OBJECT(appsrc), "caps", gst_caps_from_string(videocaps), NULL);
        g_object_set(G_OBJECT(appsrc), "max-bytes",
                gst_app_src_get_max_bytes(GST_APP_SRC(appsrc)), NULL);
        ctx = g_new0(Context, 1);
        ctx->glblapp = app;
        ctx->timestamp = 0;
        g_signal_connect(appsrc, "need-data", (GCallback)need_data, ctx);
}


gboolean bus_callback(GstBus *bus, GstMessage *msg, gpointer data)
{
        GstElement *pipeline = GST_ELEMENT(data);
        switch (GST_MESSAGE_TYPE(msg)) {
        case GST_MESSAGE_EOS:
                if (!gst_element_seek(pipeline,
                        1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
                        GST_SEEK_TYPE_SET, 1000000000,
                        GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {
                        g_message("Seek failed!");
                }else{
                        g_print(" Added data after seek");
                }
                break;
        default:
                break;
        }
        return TRUE;
}

gint main(gint argc, gchar *argv[])
{
        App *app = &s_app;
        GstBus *bus;
        GstRTSPServer *server;
        GstRTSPMediaFactory *factory;
        GstRTSPMountPoints *mountpoints;

        gst_init(&argc, &argv);
        GMainLoop *loop = g_main_loop_new(NULL, FALSE);
        GstElement *playbin = gst_element_factory_make("playbin", "play");
        app->videosink = gst_element_factory_make("appsink", "video_sink");
        g_object_set(G_OBJECT(app->videosink), "emit-signals", FALSE, "sync", TRUE, NULL);

        g_object_set(G_OBJECT(playbin), "video-sink", app->videosink, NULL);
        gst_app_sink_set_drop(GST_APP_SINK(app->videosink), TRUE);
        gst_app_sink_set_max_buffers(GST_APP_SINK(app->videosink), 1);

        bus = gst_pipeline_get_bus(GST_PIPELINE(playbin));
        gst_bus_add_watch(bus, bus_callback, playbin);

        g_object_set(G_OBJECT(playbin), "uri", "file:///C:/test.mp4", NULL);
        gst_element_set_state(playbin, GST_STATE_PLAYING);

        // RTSP server, setup and configuration
        server = gst_rtsp_server_new();
        mountpoints = gst_rtsp_server_get_mount_points(server);
        factory = gst_rtsp_media_factory_new();

        /* create a server instance */
        gst_rtsp_server_set_address(server, server_addr);
        g_object_set(server, "service", port, NULL);
        // multi-stream 
        gst_rtsp_media_factory_set_shared(factory, TRUE);
        gst_rtsp_media_factory_set_launch(factory, pipe_line_string);
        g_signal_connect(factory, "media-configure", (GCallback)media_configure, app);
        gst_rtsp_mount_points_add_factory(mountpoints, "/test", factory);
        g_object_unref(mountpoints);
        gst_rtsp_server_attach(server, NULL);
        g_print("RTSP Server started...");

        g_main_loop_run(loop);
        // Clean up
        gst_element_set_state(playbin, GST_STATE_NULL);
        gst_object_unref(bus);
        return 0;
}


        
        
        
<br/><hr align="left" width="300" />
Sent from the <a href="http://gstreamer-devel.966125.n4.nabble.com/">GStreamer-devel mailing list archive</a> at Nabble.com.<br/>