Ejemplo n.º 1
0
Track *add_track(Resource *r, char *name, MediaProperties *prop_hints)
{
    Track *t;

    t = g_slice_new0(Track);

    t->lock            = g_mutex_new();
    t->parent          = r;
    t->name            = name;
    t->sdp_description = g_string_new("");

    g_string_append_printf(t->sdp_description,
                           "a=control:%s\r\n",
                           name);

    memcpy(&t->properties, prop_hints, sizeof(MediaProperties));

    switch (t->properties.media_source) {
    case STORED_SOURCE:
        if ( !(t->parser = mparser_find(t->properties.encoding_name)) ) {
            xlog(LOG_FAT, "Could not find a valid parser\n");
            goto error;
        }

        t->properties.media_type = t->parser->media_type;
        break;

    case LIVE_SOURCE:
        break;

    default:
        g_assert_not_reached();
        break;
    }

    if (t->parser && t->parser->init && t->parser->init(t) != 0) {
        xlog(LOG_FAT, "Could not initialize parser for %s\n",
                t->properties.encoding_name);
        goto error;
    }

    r->tracks = g_list_append(r->tracks, t);

    return t;

 error:
    free_track(t, NULL);
    return NULL;
}
Ejemplo n.º 2
0
Track *add_track(Resource *r, TrackInfo *info, MediaProperties *prop_hints)
{
    Track *t;
    gint new_producer;
    // TODO: search first of all in exclusive tracks

    if(r->num_tracks>=MAX_TRACKS)
        return NULL;

    t = g_slice_new0(Track);
    t->lock = g_mutex_new();
    t->parent = r;

    t->info = g_slice_new0(TrackInfo);
    memcpy(t->info, info, sizeof(TrackInfo));
    memcpy(&t->properties, prop_hints, sizeof(MediaProperties));

    switch (t->properties.media_source)
    {
    case MS_stored:	/* demuxer_jm */
		if (r->mode == OM_SETUP)
		{
			if (prop_hints->media_type == MP_video)
			{
		        if( !(t->producer = bq_producer_new(free_payload, NULL, &new_producer)) )
		        {
		            rc_log(RC_LOG_FATAL, "add_track()->bq_producer_new() failed!");
		            goto error;
		        }
				if (new_producer)
				{
					r_start_track(r, t->producer, t->info->mrl);
				}

				r->vp = t->producer;
			}
			else
			{
				if (r->vp)
				{
					t->producer = bq_producer_ref(r->vp);
				}
			}
	    }

        if ( !(t->parser = mparser_find(t->properties.encoding_name)) )
        {
            rc_log(RC_LOG_FATAL, "add_track()->mparser_find() failed!");
            goto error;
        }
        if (t->parser->init(t))
        {
            rc_log(RC_LOG_FATAL, "add_track()->parser->init(), for encoding:%s failed!",
            	t->properties.encoding_name);
            goto error;
        }
        t->properties.media_type = t->parser->info->media_type;
        break;

    case MS_live:	/* demuxer_ls */
		if (r->mode == OM_SETUP)
		{
	        if( !(t->producer = bq_producer_new(free_payload, t->info->mrl, &new_producer)) )
	        {
	            rc_log(RC_LOG_FATAL, "add_track()->bq_producer_new() failed!");
	            goto error;
	        }
			if (new_producer)
			{
				r_start_track(r, t->producer, t->info->mrl);
			}
		}
        break;

    default:
        rc_log(RC_LOG_FATAL, "add_track():Media source not supported!");
        break;
    }


    r->tracks = g_list_append(r->tracks, t);
    r->num_tracks++;

    return t;

 error:
    free_track(t, r);
    return NULL;
}